关于JS做用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是使人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感受~~~
1.js做用域(全局变量,局部变量)内部能够访问外部,但外部的不能访问内部的 面试
var a=10; function aaa(){ alert(a); }; aaa(); //a 为外部变量即全局变量,因此能够直接访问到 结果为10
function aaa(){ var a=10; }; aaa(); alert(a); //a 为函数aaa()内部变量量即局部变量,因此没法访问到
var a=10; function aaa(){ alert(a); }; function bbb(){ var a=20; aaa(); } bbb(); //结果为10,由于aaa()函数不能访问到bbb()里面的局部变量,因此访问到的是a=10,这个全局变量。
2.不用var 定义变量时,会默认为是全局变量(不规范,不推荐)dom
function aaa(){ a=10; } aaa(); alert(a); //结果为10; //等价于: var a; function aaa(){ a=10; }; aaa(); alert(a);
//给未声明的变量赋值,此变量就会变成全局变量;var a=b=10; 能够解析成 b=10;var a=b; 也就是b为全局变量,a为局部变量,因此外部访问a访问不到,访问b结果为10;函数
因此为了不出现这种隐患,咱们在定义变量的时候把全部要定义的变量都加上var;spa
function aaa(){ var a=b=10; }
aaa();
alert(a);//结果为,没法访问到
alert(b);//结果为10;
3.变量的查找是就近原则去寻找,定义的var变量;第二点,变量的声明被提早到做用域顶部,赋值保留在原地,以下dome;code
function aaa(){ alert(a); var a=20; } aaa(); //结果为:undefined
/**************/
var a=10;
function aaa(){
alert(a);
var a=20; } aaa(); //结果为:undefined
能够解析为是:
var a=10;
function aaa(){
var a; //声明提早了
alert(a);
a=20; //赋值扔留着原地
}
aaa();
4.当参数跟局部变量重名的时候,优先级是等同的
var a=10; function aaa(a){ alert(a); var a=20; //由于 a 是形参,优先级高于 var a; 因此 局部变量a的声明其实被忽略了。 } aaa(a); //结果为:10
5.变量修改的时候另外一个变量会跟着变化,可是当变量从新被定义时,则另外一个不变化
var a=[1,2,3]; var b=a; b.push(4); alert(a);//结果为[1,2,3,4] 当b改变的时候a也发生了改变
当b从新被赋值的时候 a不会改变.示例:
var a=[1,2,3]; var b=a;
b=[1,2,3,4]
alert(a)//结果为[1,2,3]