2016-06-16 35 views
0

我對JavaScript很有點新鮮,所以剛剛學習「this」指針,我試圖用apply()來改變對象的上下文,我跑了代碼在NodeJS REPL中,並且輸出未定義且未定義。Javascript,這個指針在瀏覽器和控制檯上返回不同的值

var word="Hello"; 
    var obj={word:"GB"}; 
    function foo(){return this.word;} 
    console.log(foo()); 
    foo.apply(obj); 
    console.log(foo()); 

,我跑的Chrome瀏覽器一樣,它輸出你好你好和使用適用(),輸出應該是您好,GB。

enter image description here

我感到困惑的這種用法。 請幫忙。

+0

不要緊,你有多少次執行'FOO()'(通過'foo.apply包括(OBJ)'),你永遠不會改變的價值'this.word'爲什麼它會返回任何不同的東西? – Phil

+0

this.obj.word會給你你想要的! – sathya

+1

我覺得你的困惑來自於對['Function.prototype.apply']的錯誤理解(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)。我建議你仔細閱讀文檔,並嘗試'console.log(foo.apply(obj))' – Phil

回答

1

console.log後調用函數使用Function.apply爲您提供this背景下,同時調用使用.apply(CONTEXT)函數的值。

foo.apply(obj);不會保存this背景下,爲後來invokationfoo

var word = "Hello"; 
 
var obj = { 
 
    word: "GB" 
 
}; 
 

 
function foo() { 
 
    return this.word; 
 
} 
 
console.log(foo()); 
 
console.log(foo.apply(obj));

您可以使用.bind,並保持在一個變量的引用,因此被稱爲功能總是有binded-context

var word = "Hello"; 
 
var obj = { 
 
    word: "GB" 
 
}; 
 

 
function foo() { 
 
    return this.word; 
 
} 
 
console.log(foo()); 
 
var bar = foo.bind(obj); 
 
console.log(bar());

+0

我不知道應用不會保存上下文。謝謝:) –

0

foo.apply(obj)確實返回 「GB」,而是要傳遞foo()console.log

也許你誤會了applybind

console.log(foo()); // World 
foo = foo.bind(obj); 
console.log(foo()); // GB 

或用自己的方式:

console.log(foo.apply(obj)); // GB 
+0

是的,我希望它的工作方式綁定的話,謝謝:) –

相關問題