2012-09-26 23 views
1

調用函數時,會爲該調用創建新的詞法環境。該詞彙環境包含一個環境記錄,該記錄又保存該環境中存在的本地命名綁定。所以,舉例來說:在函數的詞法環境中更改綁定的值

(function() { 

    var x = 123; 

    // other code 

}()); 

在上面的函數調用,將存在一個名爲"x"和值123的綁定,在函數的詞法環境。現在

,如果我們想改變的是綁定的值,我們可以:

  1. 設置標識符x作爲分配運營商之一的左側:

    x = 456; 
    // the value of the "x" binding has changed to 456 
    
  2. 設置標識符x作爲前綴/後綴遞增/遞減運算符的操作數:

    x++; 
    // the value of the "x" binding has changed to 124 
    

我的問題:這些是改變「x」綁定值的唯一兩種方法嗎?

+1

'x ++;'只是'x = x + 1;'的語法快捷方式;所以您確實只有一種分配類型在這裏描述。 –

+0

是不是「轉讓」通常的術語,而不是「綁定」? –

+0

@dystroy http://ecma262-5.com/ELS5_HTML.htm#Section_10.5 – Incognito

回答

1

嗯,我認爲我們不應該在這裏談論'綁定'。鏈接@Incognito給這個問題的評論描述了變量和函數的綁定 - 但不包括它們的。因爲你的例子中的'x'有一個原始值分配,我不認爲有一種方法來改變它 - 如果不是在一個任務(直接或語法 - 糖一個)。

例如,這...

var x = 42; 
x.y = 24; 

...實際上並不會導致更改x(它被轉換成一個對象,分配一個新的屬性,但隨後這個物體將被剛剛投遠)。

這...

function x() { ... } 

...也將無法到一個新的值賦給x

更新:我的觀點是,在JS(但不是在Erlang)'var x = 42'聲明不會導致綁定42(數字字面量)變量x

+0

262-5使用「綁定」191次。我沒有看到它的問題,因爲它不能與作業交換。 – Incognito

+1

我沒有使用「綁定」作爲「賦值」的同義詞。詞彙環境中存在綁定,而分配發生在代碼中。這兩個術語描述了不同的事情。 –

+0

關於您的更新:同樣,我沒有使用術語「綁定」作爲「賦值」的同義詞。所以,值'42'被賦值給變量'x'。結果,函數詞法環境中** binding **'「x」'的值被改爲'42'。 –