JS运行题常见变量和作用域
程序员文章站
2024-02-15 12:09:34
...
原则1:函数调用时候,外层的变量在内部可以找到(全局),内部的变量外部找不到(局部) –>全局变量和局部变量
var a = 10;
function aaa(){
alert(a);
}
aaa();//10
function aaa(){
var a = 10;
}
aaa();
alert(a);//undefined
var a = 10;
function aaa(){
alert(a)
}
function bbb(){
var a = 20;
aaa();
}
bbb(); //10 函数调用就是回过头来再走里面
原则2:当var不添加的时候,会自动生成全局变量(不建议这样写,最好把所有要定义的变量添加上var)
function aaa(){
var a = 10;
}
aaa();
console.log(a);//报错 a is not defined
function aaa(){
a = 10;//程序会解析成全局变量,相当于外面定义了一个a
}
aaa();
alert(a); //10
function aaa(){
var a = b = 10;
}
aaa();
alert(a);//报错 a is not defined
alert(b);//b会变成一个相对全局的变量 //10
原则3:变量的查找是就近原则去寻找var定义的变量,当就近没有找到的话就会查找外层。
var a = 10;
function aaa(){
alert(a); //undefined
var a = 20;
}
aaa();
var a = 10;
function aaa(){
var a = 20;
alert(a);//20
}
aaa();
var a = 10;
function aaa(){
a = 20;
alert(a);//20
}
aaa();
//找var定义的
var a = 10;
function aaa(){
alert(a);//10
a = 20;
}
aaa();
/* a需要去寻找邻近的var,有var = 20,就不可能再找var a = 10了 */
var a = 10;
function aaa(){
//程序解析的结构 预解析原理
var a;
alert(a);//undefined
a = 20
alert(a); //20
var a = 21;
alert(a)//21
}
aaa();
var a = 10;
function aaa(){
bbb();
alert(a);//10
function bbb(){
var a = 20;
}
}
aaa();
原则4:当参数和局部变量重名的时候,优先级是等同的
var a = 10;
function aaa(a){
alert(a);//10
var a = 20;
}
aaa(a);
/* 基本类型的赋值只是一个值的复制,并不存在引用的关系 */
var a = 5;
var b = a;
b += 3;
alert(a);//5
/* 对象的引用关系,地址相同在内存中,所以b的修改会影响到a */
var a = [1,2,3];
var b = a;
b.push(4);
alert(a);//1,2,3,4
/* 对象的引用关系,在内存中地址相同,但是b又从新赋值,所以b的地址在内存中发生了改变,与a不在同一个引用上了 */
var a = [1,2,3];
var b = a;
b = [1,2,3,4];
alert(a);//1,2,3
/* 当参数传进来后又对a进行了从新赋值,但由于a是基本类型所以不会影响到外面的变量a */
var a = 10;
function aaa(a){
a += 3;
alert(a);//13
}
aaa(a);
alert(a);//10
/* 参数生成了之后,又重新赋值了,而不是在原有的对象上修改,在内存上又生成了一个a */
var a = [1,2,3];
function aaa(a){
a = [1,2,3,4];
}
aaa(a);
alert(a);//1,2,3
var a = [1,2,3];
function aaa(a){
a.push(4);
//alert(a)//1,2,3,4
}
aaa(a);
alert(a);//1,2,3,4