【发布时间】:2015-06-15 05:41:47
【问题描述】:
我有时会看到这种模式...
obj.method.call(obj, arg)
我不明白为什么它不同于...
obj.method(arg)
为什么要使用第一种模式?
天哪,似乎引起了很多讨论:)
为了澄清,我只是询问当方法所在的对象与call() 的第一个参数相同的情况(或者@FelixKling 说得更好:当 owner em> 与 receiver 相同)。我不是在问obj.method.call(obj2, arg)。
如下所述,即使函数绑定的情况也无法区分这两种方法。
o2={p2:3};
o={p1:(function(){return this.p2}).bind(o2), p2:2};
o.p1() === o.p1.call(o) // true
编辑
我猜这个成语的来源是用于重新绑定对象方法的模式......
obj.method.apply(obj, arguments)
【问题讨论】:
-
没有什么不同。也许作者不知道更好。
-
当然是不同的——从概念上讲。问题一般是关于 fn.call(scope, ...) 与 scope.fn(...) 的。即使提问者提出了相同的例子,他显然在这里问的是更微妙的东西。
-
@alecmc:我想我们只需要等到 OP 澄清这一点。就像你这样“清楚”地看到它,我“清楚地”看到它的另一种方式。
-
@alecmce 范围肯定不是问题吗?范围是关于声明上下文的,它是一样的吗?
call()是操纵 invocation context 我的问题是关于那个。
标签: javascript