function outter(){ //在outter中定義一個內嵌函式,inner function inner(){ alert("inner function call."); } return inner;//返回內嵌的函式。 //inner is out of scope.}function follow(){ var inner = outter();//在follow中呼叫outter,獲取inner函式的引用。 inner();//執行,我可以執行作用域外的函數了!}
上面是舉個簡單的例子,來說明函式宣告的作用域。上面的outter函式中,方法執行結束之後,inner函式的上下文已經銷燬了。正常情況下,內部函式也會隨著銷燬。但是由於我們返回了inner函式的引用,並且在follow函式中成功賦值。因此inner函式雖然已經處於作用域外了,但是由於仍然有一個引用,所以它還是可以繼續被執行。
但是follow函式結束以後,follow的上下文也銷燬了,並且這次,inner函式再也沒有機會逃離被銷燬的命運了。
因此所謂函式巢狀的問題,就是作用域 + 引用 的問題。只要搞明白了這個就可以了。
function outter(){ //在outter中定義一個內嵌函式,inner function inner(){ alert("inner function call."); } return inner;//返回內嵌的函式。 //inner is out of scope.}function follow(){ var inner = outter();//在follow中呼叫outter,獲取inner函式的引用。 inner();//執行,我可以執行作用域外的函數了!}
上面是舉個簡單的例子,來說明函式宣告的作用域。上面的outter函式中,方法執行結束之後,inner函式的上下文已經銷燬了。正常情況下,內部函式也會隨著銷燬。但是由於我們返回了inner函式的引用,並且在follow函式中成功賦值。因此inner函式雖然已經處於作用域外了,但是由於仍然有一個引用,所以它還是可以繼續被執行。
但是follow函式結束以後,follow的上下文也銷燬了,並且這次,inner函式再也沒有機會逃離被銷燬的命運了。
因此所謂函式巢狀的問題,就是作用域 + 引用 的問題。只要搞明白了這個就可以了。