gpt4 book ai didi

javascript - `setTimeout` 将 `this` 绑定(bind)到什么?

转载 作者:搜寻专家 更新时间:2023-10-31 23:08:48 28 4
gpt4 key购买 nike

我正在尝试创建一个示例来演示为什么必须使用成语 var that = this(例如,如 here 所述)。

因此,我从一个无法正确绑定(bind) this 的错误代码示例开始。然而,我写的代码给了我一些意想不到的结果(在另一个方向):

message = "message in global scope";

// the below erroneous code aims to demonstrate why we need
// the "var that = this" idiom to capture the "this" lexical scope
var createLoggingFunctionWrongWay = function () {

return function () {
console.log(this.message);
};
};

// the below *does* print "message in global scope"
// i.e. fails in the way I expected
createLoggingFunctionWrongWay.call({message:"message"})();



// I was expecting the below to also print "message in global scope" as
// well, yet it prints "undefined"
setTimeout(createLoggingFunctionWrongWay.call({
message: "message"
}), 1000);

nodejs 下运行时,我得到:

$ nodejs foo.js 
message in global scope
undefined

我的问题是为什么第二次调用(使用 setTimeout)也不会以同样的方式失败并解释 this 以指向 global Node.js 中的对象(message 变量所在的位置)?

更新当我在匿名函数中插入 console.log(this) 时,在第一次调用时我得到全局上下文对象(message 所在的位置),而在第二次调用时(通过 setTimeout)我得到以下对象:

{ _idleTimeout: 1000,
_idlePrev: null,
_idleNext: null,
_idleStart: 1446483586705,
_onTimeout: [Function],
_repeat: false
}

最佳答案

在 Node.js 中,setTimeout 的回调是用 Timeout 调用的对象绑定(bind)为上下文 (this) 对象,并且它们没有定义 message。这就是第二种方法打印 undefined 的原因。可以看到对应的代码段here .

  var timer = new Timeout(after);
var length = arguments.length;
var ontimeout = callback;
switch (length) {
// fast cases
case 0:
case 1:
case 2:
break;
case 3:
ontimeout = callback.bind(timer, arguments[2]);
break;
case 4:
ontimeout = callback.bind(timer, arguments[2], arguments[3]);
break;
case 5:
ontimeout =
callback.bind(timer, arguments[2], arguments[3], arguments[4]);
break;
// slow case
default:
var args = new Array(length - 2);
for (var i = 2; i < length; i++)
args[i - 2] = arguments[i];
ontimeout = callback.apply.bind(callback, timer, args);

关于javascript - `setTimeout` 将 `this` 绑定(bind)到什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33482551/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com