这个方法 this.method.bind(this) 是用来做什么的?

3

第一次遇到代码:

var Controller = function($scope){
    this._scope = $scope;
}

Controller.$inject = ['$scope'];

Controller.prototype.augmentScope = function() {
    this._scope.a = {
        methodA: this.methodA.bind(this)
    }
}

我真的不理解它的意义。有什么解释吗?

1
你到底不明白的是什么?.bind(this)?你有没有阅读关于.bind文档?阅读后还有什么不清楚的地方吗? - Felix Kling
创建了一个名为a的对象,其中包含1个项,即在a作用域中定义的函数methodA。绑定与将其传递给函数的this相关。因此,您需要查看类似于以下内容:this.methodA = function(){}; var a = {methodA: this.methodA.bind(this)}; - Fallenreaper
真的,那种方式行不通。我的错。像那样的东西里面没有作用域。我习惯于使用具有自己作用域的原型对象来创建对象,而不是使用映射。 - Fallenreaper
@GabrielKohen:是什么让你觉得这个问题特别涉及 this - Felix Kling
@FelixKling,你绑定的可能是由AngularJS实例化的控制器。我以前从未见过有人像这样使用控制器,但它似乎是使用this将对象的方法绑定到作用域(实际上是传递给控制器的$scope),这将允许它从Angular指令中使用,如果您决定不使用controllerAs语法。我认为这更多是一个Angular问题,代码可能误用了如何推荐使用Angular +1.3。 - Gabriel Kohen
显示剩余4条评论
1个回答

0

它假设在闭包作用域中(如果没有,则在全局作用域中,例如window)有一个名为methodA的方法。然后,因为this实际上是提到的封闭作用域,它会将其提醒并分配给通过对象a使用。 因此,您可以通过以下方式执行它:methodA()a.methodA()

编辑以解释闭包: 尽管JavaScript在语法上与Java / C ++非常相似,但它与两者都不同,因为当函数被实例化为对象时,它会记住它被实例化的范围。我强烈建议任何人做更多的JS(如果有这样的事情),请查看this article。 在JS中,this取决于它是否在实例化函数内创建 - AKA:new MyClass()。指称字面对象,例如:

var myObj={a:this.b}

不会创建一个新的this对象,并且默认情况下会引用封闭作用域。如果没有被创建,它将成为全局对象,例如浏览器中的window


好的。我猜你在使用AngularJS,因为你用了$scope,对吧? 你能分享一段在Plunkr或FiddleJS上的代码片段吗? - Gabriel Kohen
@johndoe:不,这与作用域无关。this的值通常取决于函数的调用方式.bind确保this始终引用传递的值,无论函数如何被调用。了解更多关于this的知识:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this - Felix Kling
你正在混淆闭包、作用域和 this 的概念,虽然它们之间存在一定的关联,但 .bind 与闭包或作用域毫无关系。 - Felix Kling
@Felix Kling和jonedoe。这与$scope无关,而与JavaScript作用域有关,它确定了每个作用域中'this'的含义,如上所述。 - Gabriel Kohen
@GabrielKohen:不,我特别指的是JS作用域。 “但它与JavaScript作用域有关,后者确定每个作用域中'this'的含义。” 这是巧合的,因为在ES5中只有函数创建作用域。然而,在ES6中,块和类也会创建作用域,但它们具有与父环境相同的“this”值。正如我所说,作用域和'this'之间肯定存在关系,但说'this' 作用域是完全错误的。 - Felix Kling
显示剩余2条评论

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