2011-05-18 44 views
3

我在學習javascript,有人可以爲我解釋下面的代碼片段嗎?Javascript基本知識:可變範圍

 

var state=true; 
function bob(){ var state=false; } 
bob() 
 

什麼應該是國家的價值,爲什麼?

非常感謝, 大號

回答

3

在執行結束時,statetrue,因爲函數bob()定義了一個名爲state,而不是分配給同名的全局變量的局部變量。然而,在下面的例子中,state是假的:

var state=true; 
function bob(){ state=false; } 
bob(); 

通過省略var關鍵字,JavaScript引擎將前往了尋找一個名爲state變量的作用域鏈,直到它找到一個或達到全球範圍內。這可以進一步證明與嵌套函數:

var state = true; // global 
function bob() { 
    var state = true; // local to `bob()` 
    function jim() { 
     state = false; 
    } 
    jim(); 
    alert(state); //-> false, `jim()` modifies `bob()`'s variable 
} 
bob(); 
alert(state); //-> true, `jim()` and `bob()` don't touch the global variable 
+1

得知,謝謝你:) – lshettyl 2011-05-18 10:27:55

0
var state=true; //global scope variable called 'state' => true 
function bob(){ 

    var state=false; //local scope variable called 'state' => false, no global 'state' overwritten 
    //state = false; would overwrite global 'state' 

} 
bob(); //call function 

//global 'state' remains true 
+0

謝謝你的回答:) – lshettyl 2011-05-18 10:28:30

0

如果要值改變gloabl「狀態」爲假,執行以下操作(不(再)聲明一個局部變量的鮑勃()功能):

var state=true; 
function bob(){ state=false; } 
bob() 

狀態將是:

false 
+0

哈,同一個答案几乎一樣! :) – 2011-05-18 10:28:39

1

約ECMA-/ JavaScript的非常重要的事實是,我有隻有功能範圍

這是我教任何人學習它的第一件事。 Javascript的另一個概念是範圍鏈。這是用非常簡短的話來說的,是一種保存在背景下的內部財產。每個函數都會創建一個(執行)-Context並將所有父上下文存儲在其內部[[Scope]]屬性中。現在,當你在一個函數中訪問一個變量名時,Javascript解釋器會嘗試解析該變量。搜索開始於它自己的激活對象(另一件事,我將跳過這裏的解釋),如果發現搜索停止。如果在那裏找不到變量,那麼JavaScript會訪問其[]的[[Scope]]屬性,並從所有父範圍詞法(詞法範圍...)中搜索激活對象。

然後採取該變量的第一個匹配。如果變量名在scopechain中的任何地方都找不到,則返回undefined

現在在你的代碼片段中,我們創建了兩次變量state。第一次,全局上下文將變量存儲在它的變量對象(與激活對象相同,但是用於非函數上下文)。

第二次,我們在bob()的執行上下文中創建了state,並且Javascript將它存儲在它的Activation對象中。因此,當我們在Bob的上下文中訪問state時,其始終爲false,因爲我們的解析查找過程在我們自己的Activation對象中開始。

如果我們訪問的Bobstate之外,我們只是會發現在來自全球範圍內的變量對象 變量state(實際上是全局對象本身)和它的true那裏。


對整個主題的更多和更精確的信息:
http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

0

如果你把它改成如下:

var state=true; 
function bob(){ state=false; } 
bob(); 

然後在執行結束,statefalse 。這是因爲bob()中的執行上下文將查找名稱爲state的本地變量,它不會找到(在state之前沒有var來聲明新的局部變量),並且如果找不到它,它將移動到下一個詞法上下文,它將在其中看到您的全局變量scope,它將修改爲false