2014-08-31 39 views
1

//我不明白爲什麼這不工作執行上下文和((此對象))

y = 'window'; 
var x = { 
    y : 'x', 
    func : function(){ 
     return function(){ 
      return this.y 
     } 
    } 
}; 

x.func()(); 

// when I execute x.func()() I understand why it should return y 
// x.func() would return a function in the global context and then execute it ' should return 'window' ' 
y = 'window' 
var x = { 
    y : 'x', 
    func : function(){ 
     return function(){ 
      return this.y 
     }() 
    } 
}; 

x.func(); 

爲什麼這段代碼也返回「窗口」是x對象的內部執行

+0

的可能重複[Javascript「這個」嵌套函數內的指針](http://stackoverflow.com/questions/9644044/javascript-this-pointer-within-nested-function) – 2014-08-31 02:49:02

回答

1

呼叫x.func()()使用x作爲上下文調用功能x.func,然後使用無上下文調用返回的值。功能定義在哪裏並不重要;只是它被稱爲如何。

爲了避免這種情況,您可以返回之前的功能綁定到特定的情境:

var x = { 
    y: 'x', 
    func: function() { 
     return function() { 
      return this.y; 
     }.bind(this); 
    } 
};

ES6箭頭功能也使用詞法this,相當於bind

var x = { 
    y: 'x', 
    func: function() { 
     return() => this.y; 
    } 
}; 
+0

是的問題是與第二個片段? 這= =在運行時進行評估。 它應該返回'x'而不是'窗口'吧? – aeid 2014-08-31 00:23:14

+0

@ user3260606:'(function(){})()'不會與任何上下文一起執行,無論它在哪裏定義。 ''x.func()','x ['func']()','func.call(x,...)'和'func.apply(x,[...])'是函數的唯一方法用非默認的'this'調用。 – Ryan 2014-08-31 00:24:33