var a = 10; functionaaa() { alert(a); } functionbbb() { var a = 20; aaa(); } bbb(); // 10
黄金守则第二条
变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。
1 2 3 4 5 6 7 8
functionaaa() { alert(a); var a=b=10; //相当于 var a = 10; b=10; 此时 b 为全局变量,a 函数 aaa 的只是局部变量 } aaa(); // undefined ----- var变量声明提前(仅仅将声明提前,初始化仍在远处进行) alert(b); // 10 alert(a); // console面板报错 “ReferenceError: a is not defined”
黄金守则第三条
当参数跟局部变量重名时,优先级是等同的。
1 2 3 4 5 6 7
var a = 10; functionaaa(a) { alert(a); var a = 20; } aaa(a); // 10 aaa(); // undefined
黄金守则第四条
参数的传递都是按值传递。基本类型的这个值指基本类型值,引用类型的这个值指引用类型的指针。
变量的情况
1 2 3 4 5 6 7 8
var a = 5; var b = a; b +=3; alert(a);//5 var a = [1,2,3]; var b=a; b.push(4); alert(a);//[1,2,3,4];
引用类型变量重新赋值后,会不一样:
1 2 3 4 5
var a = [1,2,3]; var b=a; b = [1,2,3] // 此处,b被重新赋值了,也就不再指向a了。 b.push(4); alert(a);//[1,2,3];
参数的情况
参数与变量的作用域是相似的:
1 2 3 4 5 6 7
var a = 10; functionaaa(a) { a += 3; alert(a); } aaa(a); // 13 alert(a); // 10
1 2 3 4 5 6
var a = [1,2,3]; functionaaa(a) { a.push(4); } aaa(a); alert(a); // 1,2,3,4
引用类型参数重新赋值后,会不一样:
1 2 3 4 5 6 7
var a = [1,2,3]; functionaaa(a) { a = [1,2,3]; a.push(4); } aaa(a); alert(a); // 1,2,3
最后一个比较怪的
1 2 3 4 5 6 7 8 9 10 11 12
var arry = []; arry[0] = 'a'; arry[1] = 'b'; arry.foo = 'c'; arry['foo'] = 'd'; //不报错 console.log(typeof arry.foo); // step2: string console.log(typeof arry['foo']); // step3: string console.log(arry.foo); // step4: d console.log(arry['foo']); // step5: d console.log(arry.length); // step6: 2 alert(arry); // step1: a,b arry[foo] = 'e'; //报错 ReferenceError: foo is not defined