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
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
如果你正試圖獲得全局變量不使用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);
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
是沒有定義,因此結果undefined
。 setTimeout
從主線程中獲取要執行的函數,並將其放入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
很好的解釋! –
好的答案,謝謝! – zys
但爲什麼它在Chrome控制檯中工作? – zys
第二個結果是2不是1. – zys