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),成为全局变量闭包
简单来讲就是无论函数被在哪里调用,函数的做用域链早就在定义函数的时候固定了。模块化
此特性被普遍用于模块化,闭包。函数