今天逛社区,无意间看到一段JS代码,感觉挺有意思,记录下来。
代码:
1 <script> 2 var money =110; 3 function say() 4 { 5 alert(this.money); 6 alert(money); 7 var money = 200; 8 alert(money); 9 } 10 say(); 11 </script>
运行结果:
突然看到的时候不假思索的就认为输出的是110,110,200,后来发觉自己错了。原来这里面有个 Js作用域与作用域链。
在js里面,当方法执行的时候会为方法产生一个执行环境,环境里面有方法的作用域链。这个作用域链我把它理解为指令集一样的东西。
this.money是直接访问windows作用域里的money,因为say函数的调用者是window,所以this就是window。
第一个alert(monry)先去say方法的作用域里面找money,找到了,但是没有赋值,因为var money = 200语句没有执行,money只是声明了一个变量,所以是undefined。
var money = 200是在say方法里面给money变量赋值
第二个alert(money)执行的时候,又是通过函数的作用域去找money,也找到了,但是这次money已经赋值了,为200。
网上找的一个关于js作用域与作用域链的例子:
1 <script> 2 var money =110; 3 function say() 4 { 5 alert(this.money); 6 alert(money); 7 var money = 200; 8 alert(money); 9 } 10 person={name:"yhb",age:22,height:175,wife{name:"lwy",age:21}}; 11 with(person.wife){ 12 alert(name); 13 } 14 say(); 15 </script>
运行结果:先弹出lwy后面的三个顺序和上面一样
with语句主要用来临时扩展作用域链,将语句中的对象添加到作用域的头部。with语句将person.wife添加到当前作用域链的头部,所以输出的就是:“lwy"。 with语句结束后,作用域链恢复正常。