【问题标题】:Does .bind(this) pass by reference or by value?.bind(this) 是按引用传递还是按值传递?
【发布时间】:2018-09-24 21:03:25
【问题描述】:

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

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

我作为参数传递给bindthis 是通过引用传递还是通过值传递?因此,如果我稍后在外部代码块中更改this 对象的参数,然后调用foofoo 将在我调用bind 时使用this 的值,或者当时我打电话给foo

【问题讨论】:

  • 从技术上讲,有no pass-by-reference in javascript。不过,this 是对您的对象的引用,因此您将对象的引用传递给函数,因此如果您在函数内部更改 this,那么原始对象也会发生变异。跨度>
  • JavaScript 中的一切都是按值传递的,句号。按值传递引用与按引用传递不同。
  • 你好@ibrahimmahrir。大多数高级编程语言将按引用传递作为按值传递指针。很明显这不是我要问的,因此它不是很有帮助。抱歉,我真的不明白你想在这里贡献什么。
  • 这不是真的。它根本不实现传递引用。在这种情况下,无论this 是通过引用还是值传递,它所指向的对象的属性都是相同的,因为只有一个对象。如果你真的没有问你问什么,那么你应该把问题改成你问什么。
  • @fgb 你没有抓住重点——这个问题与 JavaScript 的“传递引用”是如何在幕后实际实现无关的。

标签: javascript binding this pass-by-reference pass-by-value


【解决方案1】:

如果您要更改 this 对象的值,那么 foo 将在调用 foo 时获得 this 的新值。

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

【讨论】:

    【解决方案2】:

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

    在你打电话给 foo 的时候。

    this 是对象的引用。这意味着 Object 可能会在某个时候发生变异,您将获得它的“最新”值。

    【讨论】:

    • 我想说this 的值在绑定和调用foo 时都是相同的。它仍然是同一个对象;但是,它的属性可能会改变。
    猜你喜欢
    • 2016-11-28
    • 2017-11-14
    相关资源
    最近更新 更多