2012-03-30 71 views
5

考慮代碼:爲什麼Javascript不會讓函數本身重新定義自己?

window.a = function(x){ 
     var r = x*2; 
     window.a =alert; // redefines itself after first call 
     return r; 
    }; 
    a('2 * 2 = '+a(2)); // doesn't work. it should've alerted "2 * 2 = 4" 

這不起作用或者:

window.a = function(x){ 
     alert(x); 
     window.a = function(x){ // redefines itself after first call 
      var r = x*2; 
      return r; 
     } 
    }; 
    a('2 * 2 = '+a(2)); // doesn't work. it should've alerted "2 * 2 = 4" 

既不做到這一點:

window.a = function(x){ alert(x); window.c = window.a; window.a = window.b; window.b = window.c; }; 
    window.b = function(x){ var r = x*2; window.c = window.b; window.b = window.a; window.a = window.c; return r; }; 
    a('2 * 2 = '+a(2)); // doesn't work. 

,基本上我已經嘗試了所有可能的方式也不似乎做的工作。有人可以解釋爲什麼嗎?

+1

出於好奇,你爲什麼要這麼做? – maialithar 2012-03-30 11:07:35

+0

嗯,第一個實際上適用於我(Chrome 18) – Yoshi 2012-03-30 11:10:28

+0

在Chrome和IE中工作得很好... – 2012-03-30 11:11:21

回答

8

成功地重新定義函數,它只是表達調用它已經抓住了老函數的引用:這種情況發生在呼叫表達的東西定義調用評估什麼功能的第一件事情,看本說明書的Section 11.2.3

11.2.3函數調用

生產CallExpression:MemberExpression參數被評估小號如下:

  1. 裁判是評估MemberExpression的結果。
  2. func成爲GetValue(ref)。
  3. argList是評估參數的結果,生成參數值的內部列表(參見11.2.4)。
  4. 如果類型(func)不是Object,則拋出TypeError異常。
  5. 如果IsCallable(func)爲false,則引發TypeError異常。
  6. 如果Type(REF)是參考,然後
        a)如果IsPropertyReference(REF)爲真,則
               我。假設thisValue是GetBase(參考號)。
        b)中否則,REF的鹼是環境記錄
               我。假設thisValue是調用GetBase的ImplicitThisValue具體方法(ref)的結果。
  7. 其他類型(參考號)不是參考。
    a)讓這個值爲未定義。
  8. 返回調用FUNC的[[調用]]內部方法,提供thisValue作爲該值,並提供所述列表ARGLIST作爲參數值的結果。

步驟1和2發生在函數重新定義之前。

的解決方法當然是讓事情在你期望的順序發生(live example | source):

window.a = function(x){ 
    var r = x*2; 
    window.a =alert; // redefines itself after first call 
    return r; 
}; 
var val = a(2); 
a('2 * 2 = '+ val); 

邊注:有趣的是your first example作品在Chrome(V8)(也在IE6的JScript版本中工作;但是,JScript有批次的問題)。它不應該工作,並且不在Firefox(SpiderMonkey),Opera(Carakan)或IE9(Chakra)中。

1

對於操作符參數的評估順序,JavaScript有嚴格的從左到右的規則。我猜測這包括函數調用操作符,這意味着在表達式之前評估第一個a

相關問題