javascript Function.call中的this指向问题
大家讲道理
大家讲道理 2017-04-11 13:24:32
[JavaScript讨论组]

已知如下代码:

var foo = 1;
var bar = 10;

function a (arg, func) {
  this.foo = arg + this.bar;
  func(this.foo);
}

var b = {
  foo: 100,
  bar: 1000
};

a.call(b, 10000, function(x) {
  console.log(this.foo + x);
});

问: 该代码执行后控制台打印结果是什么?分析产生该结果的原因。

我本来以为执行结果会是22000,因为直接把call中的参数带入函数a后是:

function a (arg, func) {
  this.foo = arg + this.bar;
  console.log(this.foo + this.foo);
}

然后由于arg = 10000,b.foo = arg + b.bar = 10000 + 1000 = 11000,11000 + 11000 = 22000.

但是执行结果却是11001,也就是说console.log里的this指向的是window,对此我表示不解,既然这个function是作为a的参数带入的,既然athis被指向了b,为什么这里的this不会指向b呢?希望各位高手解惑。另外,如果这个this不指向b,有没有什么方法在仍使用this.foo的情况下将这个this指向b

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(5)
阿神
function a (arg, func) {
  this.foo = arg + this.bar;
  (func.bind(this))(this.foo);
}
高洛峰

因为你在传func的时候没指定this,传了一个匿名函数,然后在a里面直接执行了没指定this,在非严格模式下,this指向window。

怪我咯

因为call强制绑定了this,所以执行时a中的this确实是b,执行a中的func时,这可是一个匿名函数,肯定是绑定在window上了

怪我咯
a.call(b, 10000, function(x) {
  console.log(this.foo + x);
}.bind(b));

就可以将该匿名函数的 this 绑定到 b 上。

伊谢尔伦

call第一个参数即是调用方法的执行者,它可以改变this所指代的对象。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号