前言:和大多數編程語言同樣,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