JavaScript中bind绑定失效

第一段代码:

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);

上面回调函数,没有调用结果,也没报错???

阅读 4.1k
5 个回答

控制台

  • 一是记录各处报错、提醒以及 console.log 等处要求记录的内容;
  • 二是返回最后一个在控制台中运行的返回控制台环境的值。

你也可以看到明显差别:

// Test 1
> var a = 1; console.log(a)
  1
< undefined
// Test 2
> var a = 1; a
< 1

> 是输入,要求控制台执行的东西;
< 是输出,要求执行的东西向控制台返回了什么;
Test 1 中前面白白的空空的 1 是某段 JS 要求控制台记录的。

理解后看题,< 2094,2094 是该 setTimeout 返回的一段浏览器用于标记的基本无意义数字,(好像只能用于 clearTimeout)具体自查。而因为你是在控制台执行,所以它返回给控制台,所以控制台出现了 2094。然后那个 5 前面白白的,说明是某段代码要求记录的。

第二段的 return 即返回,因为这段代码是 setTimeout 执行的,所以它返回给 setTimeout(还是 window?反正不是控制台),而不是控制台,对于控制台已经不可能会有值返回给它了(原因不解释),所以控制台返回最后一个返回给它的值,也就是另一段标记那个 setTimeout 的随机无意义数字。且也没有什么 console.log 要求记录,所以就不再有新结果。

而不是什么 bind 失效。

再想想回看别的答主的答案。这个问题可能因太简单,可能都没多少人想理你…

console.log的作用就是输出信息, 你都没地方显示输出 add 函数的 return 值

你并没有打印它啊,你可以这样:

setTimeout(function() {
  console.log(add.bind(obj)());
}, 1000);

你在js文件中写

var a = 1;
console.log(a); // 控制台会输出 1
var a = 1;
a; // 控制台没输出,因为你并没有让它输出。

第二种是会输出的
clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题