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

Posted

技术标签:

【中文标题】.bind(this) 是按引用传递还是按值传递?【英文标题】:Does .bind(this) pass by reference or by value? 【发布时间】: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 的“传递引用”是如何在幕后实际实现无关的。 【参考方案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 时都是相同的。它仍然是同一个对象;但是,它的属性可能会改变。

以上是关于.bind(this) 是按引用传递还是按值传递?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 是按引用传递还是按值传递? [复制]

js传参是按值传递还是按引用传递?

Ruby 是按值传递还是按引用传递? [复制]

JavaScript 是按引用传递还是按值传递语言?

PHP 变量是按值传递还是按引用传递?

JS基础类型和对象,分别是按值传递还是按引用传递?