2017-07-20 99 views
2
未定義
var x = 1; 
var o = { 
    x: 2, 
    y: function() { 
     console.log(this.x); 
    } 
}; 
setTimeout(o.y, 1000); 

節點版本:8.1.3JS的全局變量在setTimeout的

EXCUTE節點main.js --->未定義

但得到的Chrome控制檯正確結果1

回答

1

如果你正試圖獲得全局變量不使用this

var x = 1; 
 
var o = { 
 
    x: 2, 
 
    y: function() { 
 
     console.log(x); 
 
    } 
 
}; 
 
setTimeout(function(){o.y()}, 1000);

否則像這樣使用:

var x = 1; 
 
var o = { 
 
    x: 2, 
 
    y: function() { 
 
     console.log(this.x); 
 
    } 
 
}; 
 
setTimeout(function(){o.y()}, 1000);

+1

好的答案,謝謝! – zys

+0

但爲什麼它在Chrome控制檯中工作? – zys

+0

第二個結果是2不是1. – zys

1

我還沒有測試過,但這應該工作。我會稍後運行它。

var x = 1; 
var o = { 
    x: 2, 
    y: function() { 
     console.log(this.x); 
    } 
}; 
setTimeout(function(){o.y()}, 1000); 
+0

謝謝,你在o.y丟了「()」 – zys

+0

我測試過,結果是2不是1 – zys

2
var x = 1; 
var o = { 
    x: 2, 
    y: function() { 
     console.log(this); 
    } 
}; 
setTimeout(o.y, 1000); 

如果將經由節點運行時,看這個代碼的輸出,這將是象

Timeout { 
    _called: true, 
    _idleTimeout: 1000, 
    _idlePrev: null, 
    _idleNext: null, 
    _idleStart: 39, 
    _onTimeout: [Function: y], 
    _timerArgs: undefined, 
    _repeat: null } 

正如你可以此在Timeout對象的this對象和值x是沒有定義,因此結果undefinedsetTimeout從主線程中獲取要執行的函數,並將其放入eventLoop中以稍後執行。傳遞給eventloop的是函數定義。當在Timeout上下文中執行時,它是未定義的。

讓我們在瀏覽器控制檯再次運行此程序

var x = 1; 
var o = { 
    x: 2, 
    y: function() { 
     console.log(this); 
    } 
}; 
setTimeout(o.y, 1000); 

這一次的輸出將是Window對象,我們在窗口範圍內定義x以及因此this.x輸出將1,而不是2

Alexander-Higgins已經提到了正確的方法。

如果您想了解更多關於事件循環的信息,我建議您在事件循環中傾聽這個優秀的演講。 https://www.youtube.com/watch?v=8aGhZQkoFbQ

+0

很好的解釋! –