探索javascirpt-作用域

1.使用var定义变量,和漏了var定义变量时的情况

  

function a() {
	function c(){
		cc = 4;
		function d() {
			console.log(cc);//4
		}

		d();
	}

	c();
	console.log(cc);//4
}
a();
console.log(cc);//4
console.log(window.cc);//4

  

很明显当未使用var定义变量时,cc变量被定义于全局变量,

但是,真的只要不使用var就会被挂入window吗?其实不是,看下列代码

 

 1 function a() {
 2     var bb = 3;
 3     var cc = 5;
 4     function c(){
 5         cc = 4;
 6         function d() {
 7             console.log(cc);//4
 8         }
 9 
10         d();
11     }
12 
13     c();
14     console.log(cc);//4
15 }
16 a();
17 console.log(cc); //undefined
18 console.log(window.cc); //underfined

是否很惊奇,此时cc被挂入了a函数里定义的cc,所以是否有领悟:

当未用var定义变量的时候,javascript引擎会检索作用域层级来解析用户名,从作用域链中一层一层往上查找变量,如果查找得到,边改变其值,如果整个作用域链中都查找不到,便会挂入window(nodejs为global),成为全局变量

2,javascript中的函数作用域是通过词法来划分的

  简单来说就是不管函数被在哪里调用,函数的作用域链早就在定义函数的时候固定了。

  此特性被广泛用于模块化,闭包。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。