探索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变量被定义于全局变量,javascript

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

 

 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,因此是否有领悟:node

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

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

  简单来讲就是无论函数被在哪里调用,函数的做用域链早就在定义函数的时候固定了。模块化

  此特性被普遍用于模块化,闭包。函数

相关文章
相关标签/搜索