第一段代码:
function add(){
console.log(this.x + this.y);
};
var obj = {
x: 2,
y: 3
};
setTimeout(add.bind(obj), 1000);
上面回调函数,能正确调用,显示结果 5
第二段代码:
将函数中的 console.log 改成 return
function add(){
return (this.x + this.y);
};
var obj = {
x: 2,
y: 3
};
setTimeout(add.bind(obj), 1000);
上面回调函数,没有调用结果,也没报错???
控制台
你也可以看到明显差别:
>
是输入,要求控制台执行的东西;<
是输出,要求执行的东西向控制台返回了什么;Test 1 中前面白白的空空的 1 是某段 JS 要求控制台记录的。
理解后看题,< 2094,2094 是该
setTimeout
返回的一段浏览器用于标记的基本无意义数字,(好像只能用于clearTimeout
)具体自查。而因为你是在控制台执行,所以它返回给控制台,所以控制台出现了 2094。然后那个 5 前面白白的,说明是某段代码要求记录的。第二段的
return
即返回,因为这段代码是setTimeout
执行的,所以它返回给setTimeout
(还是window
?反正不是控制台),而不是控制台,对于控制台已经不可能会有值返回给它了(原因不解释),所以控制台返回最后一个返回给它的值,也就是另一段标记那个setTimeout
的随机无意义数字。且也没有什么console.log
要求记录,所以就不再有新结果。而不是什么 bind 失效。
再想想回看别的答主的答案。这个问题可能因太简单,可能都没多少人想理你…