前言:和大多数编程语言同样,js也采用词法做用域,即函数的执行依赖于变量做用域,这个做用域是在函数定义时决定的,而不是函数调用时决定的。函数对象能够经过做用域链关联起来,函数体内部的变量均可以保持在函数做用域内,这种特性在计算机文献中被称之为闭包
(==含义是指函数变量能够被隐藏于做用域链以内,所以看起来函数将变量包裹起来了==)。javascript
首先咱们先来看一段代码:java
var scope = 'global scope' //全局变量 function checkScope(){ var scope = 'local scope';//局部变量 function f(){ //嵌套函数 console.log(scope); }; return f() //返回f执行结果 }; checkScope(); //运行结果 local scope;
这段代码很容易看懂,在调用checkScope的时候,该函数内部把f的运行结果返回;
下面咱们把上面的代码稍加改造:编程
var scope = 'global scope' //全局变量 function checkScope(){ var scope = 'local scope';//局部变量 function f(){ //嵌套函数 console.log(scope); }; return f //返回f执行结果 }; checkScope()(); //运行结果 local scope;
如今在调用checkScope的时候返回的仅仅是一个函数对象,此时在checkScope外部调用这个函数对象,那么他里面的返回结果仍是local scope而不是global scope;
原理:js的执行用到了做用域链,这个做用域链是在函数定义时建立的。嵌套函数f定义在这个做用域链里,其中的scope必定是局部变量,无论任什么时候候执行f,这种绑定在执行f的时候依然有效。(闭包的这种特性强大到让人吃惊,它们能够捕捉到局部变量(和参数),并一直保存下来)。闭包
加入QQ群,和更多同道中人一块儿happy吧!!!
app