.bind(this)传递的是引用还是值?

7

我在某个地方创建了一个函数,并将其绑定到this,这样我就可以在函数内使用父块的this作为this的值。例如:

var foo = function() {
    // some stuff involving other stuff
}.bind(this);

bind方法中传递的this参数是按引用还是按值传递的呢?如果稍后在代码块的外部更改this对象的参数,然后调用foo,那么foo会使用我调用bind时的this值,还是调用foo时的this值呢?


6
从技术上讲,JavaScript中没有传递引用的方式。但是,this是对你的对象的引用,因此你将对象的引用传递给函数。如果你在函数内部更改了this,那么原始对象也会被改变。请注意,这里的“引用”是指值的内存地址,而不是像一些其他编程语言中那样的直接引用。 - ibrahim mahrir
4
JavaScript 中的所有内容都是按值传递的,就此结束。按值传递引用并不等同于按引用传递。 - wchargin
2
嗨,@ibrahimmahrir。大多数高级编程语言实现的按引用传递是通过传递指针的值来实现的。很明显这不是我要问的,因此并没有什么帮助。很抱歉,但我真的不明白你在这里想做出什么贡献。 - hitecherik
2
这不是真的。它根本没有实现按引用传递。在这种情况下,无论 this 是按引用还是按值传递,它所指向的对象的属性都将是相同的,因为只有一个对象。如果你真的没有问你所问的问题,那么你应该把问题改成你所问的问题。 - fgb
2
@fgb 你没有理解问题的关键点——这个问题与JavaScript的“按引用传递”在幕后实际上是如何实现无关。 - Zak
显示剩余4条评论
3个回答

6

如果我稍后在代码的外部块更改了此对象的参数,然后调用foo,foo会使用我调用bind时的this值还是调用foo时的this值?

它会使用你调用foo时的this值。

this是一个指向对象的引用。这意味着对象可能在某个时刻发生变化,你将得到“最新 - 最新”的值。


我认为,在绑定时和调用 foo 时,this 的值将是相同的。它仍然是同一个对象;但是,它的属性可能会改变。 - rhino

2
如果您更改this对象的值,那么在调用foo时,foo将获得this的最新值。请注意保留HTML标签。

var module = {
  x: 42,
  getX: function () {
    return this.x;
  }
}

var retrieveX = module.getX;
console.log(retrieveX()); // The function gets invoked at the global scope
// expected output: undefined

var boundGetX = retrieveX.bind(module);
module.x = 52;
console.log(boundGetX());


0
抱歉,我没有足够的声望来发表评论。如果是按引用传递,那么为什么这里两个块的输出相同:

var module = {
  x: 5,
  b:{
    a:5,
    getX: function () {
        console.log(this.a)
    return "hello world";
  }
  }
  
}
const boundGetX = module.b.getX.bind(module.b);
console.log(boundGetX());
module.b={
    a:45678,
     getX: function () {
    return "hello world2";
  }
}
console.log(boundGetX());


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接