重新探索JavaScript范围
黄金法则第一条:
Js没有块级作用域(可以通过闭包或其他方法实现),只有函数级作用域,可以在函数外的变量函数中找到,但不能在函数内的变量外找到。
首次尝试:
这是为什么?
var a=10函数AAA(){//step-4 alert(a);//step-5-执行预警,此时,你只能找到外面a=10的弹出框10}函数BBB(){//step-2 var a=20;AAA();//step-3}//定义函数没用,调用是真实的,这里是step-1 BBB();//step-1其实原理大家都懂,但应该是容易出错的,没有它一切都无法改变。
第二次尝试:
这是为什么?因为当B被赋给A时,B是未定义的,所以A是未定义的,B是10。
黄金法典第2条:
变量的搜索是基于邻近性原则,即寻找var定义的变量,在附近找不到外层时寻找外层。
看:
这是为什么?这有两个原因,一是预分析,二是就近搜索。
var a=10函数AAA(){ alert(a);//undefined,找A的时候会在现在的函数中找到。因为预分析,此时A是未定义的,所以绝对不会找外面的10。var a=20/*预解析var a ert(a);var a=20*/} AAA();
注意:
好吧,第二个被证实了。虽然是邻近原理,但是就是在附近找到var声明的变量。这是因为没有var声明的变量是全局的,这里只修改A的值。所以上面是因为var的A在函数中没有找到,所以我去外面找,一找到就找到了,所以A给出了10的警戒;不过确实a=20后,A确实是20,但是警戒的时候还没有实施~ ~
看~
以下示例仅验证js的功能范围:
这是因为当alert(a)出现时,bbb函数中的A确实是20,但此时它是局部的来alert(a)。alert(a)在bbb函数中根本找不到A,所以在aaa函数中也找不到A,于是就出去找,找到了10。
黄金法典第3条:
当参数与局部变量同名时,优先级相等。
示例:
另外,在传递参数时,基本类型传递值,引用类型传递引用。(但重新分配后就不是这样了。)
var a=5;var b=a;b=3;警报(a);//5var a=[1,2,3];var b=a;b . push(4);警报(a);//[1,2,3,4];上面的代码没有问题,但是下面的代码不同。
因为b被重新分配了,所以不指向a。
此外,参数和变量的范围也类似:
比较这两个:
以上,参数是基本类型,只传入值。下面传入一个引用类型:(也包括重赋值的情况)
版权声明:重新探索JavaScript范围是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。