【发布时间】:2016-10-18 11:48:02
【问题描述】:
我有一个对象“我”,并为其定义了函数。
me.prototype.f = function(args){
console.log("f called");
};
我需要在异步函数中提供 f 作为回调。
me.prototype.operation = function (){
var self = this;
var client; // an io client
//client.on("data", self.f); --a
//client.on("data", self.f.bind(self)) --b
}
在这种情况下,上面的 a 和 b 有什么区别吗?是否存在 a) 可能失败的情况?
在哪些情况下我们会在没有绑定的情况下遇到问题?通常,值可能会根据上下文发生变化。 (例如,使用循环索引值关闭)
那么,在不同的场景中,值可能会有所不同。
从答案中我得出以下结论。请确认:
a) 当函数作为引用传递时,范围会发生变化,并且会获取本地引用,除非上下文没有使用 bind、call 或 apply 绑定。
b) 特别是在回调/异步函数中,如果上下文发生变化(例如setTimeout,上下文会发生变化,因此在调用过程中self的含义会发生变化。)
c) 它与闭包无关,因为在闭包中会检查词法环境以评估值,但是,这里会评估执行期间的上下文
【问题讨论】:
-
如果在
f函数中使用this,将会遇到问题。这就是你bindthis发挥作用的原因。 -
简单示例
var a = {f: function(){console.log(this)}}; a.f(); var f = a.f; f();。您在第二次执行中丢失了this,与使用self.f丢失的相同 -
@Maxx 如果我将函数调用为
client.on("data", self.f);,在这种情况下,我的this也将被保留,因为 self 的上下文将与函数调用相关联(因为它是一个成员函数)。那么a)和b)有什么区别 -
您的
selfvar 在您的示例中绝对没用,它什么也不做。在a)中,您将一些函数f传递给客户端,当您的client调用f时,f对其上下文一无所知。在 b) 中,您将上下文绑定到f -
self这里指的是me的实例,因此提供了与之相关的功能。这两个案例都有评论,我想讨论一下。
标签: javascript binding prototype