2016-12-15 68 views
-2

我在「JavaScript中確定指導」讀這些行,我無法理解爲什麼內部函數的作用域鏈會有所不同,每次函數被調用嵌套函數作用域鏈中的JavaScript

「在頂部級別的JavaScript代碼(即代碼不包含在任何函數定義中), 作用域鏈由單個對象組成,全局對象
在非嵌套函數中,作用域鏈由兩個對象組成
第一個是定義函數 參數和局部變量的對象,th第二個是全球性的對象。
在嵌套函數中,作用域鏈有三個或更多對象。

瞭解如何創建對象的鏈 是很重要的。
當定義一個函數時,它存儲範圍鏈然後生效。
當該函數被調用時,它會創建一個新對象來存儲其局部變量,並且 將新對象添加到存儲的作用域鏈中以創建一個新的更長的鏈,該鏈表示該函數調用的作用域。

對於 嵌套函數,這會變得更有趣,因爲每次調用外部函數時,都會再次定義內部函數 。
由於範圍鏈在每次調用外部函數時不同,因此內部函數在每次定義時都會有細微的差別 - 內部函數的代碼在每次調用外部函數時都是相同的,但範圍與該代碼關聯鏈 會有所不同。」

+7

404:未找到問題。 – Lain

+3

請使用「編輯」鏈接標記引用的部分並將其與問題分開。請也澄清你的問題。 –

+0

完成和thanx。 –

回答

1

每次調用函數的時候,你的功能是調用創建一個新的範圍。

定義的任何變量(與var,函數聲明,或一個命名參數)在該功能範圍內的功能

function foo (bar) { }; 
foo(1); 
foo(2); 

在上面,創建了兩個範圍。在一個其中,bar是在其他bar1是2


如果函數在另一個函數定義,那麼它可以訪問它是在創建的範圍。

function foo (bar) { return function() { console.log(bar); } }; 
var foo1 = foo(1); 
var foo2 = foo(2); 

分配給foo1的功能可以訪問bar1的範圍。

分配給foo2的功能可以訪問bar2的範圍。