6

我正在看一些看起来像的代码

this.f.call(this);

或者在其他一些情况下

this.someObj.f.call(this.someObj);

这些和有什么区别吗

this.f();
this.someObj.f();

在任何情况下行为会有所不同吗?(例如,如果thisorsomeObj为 null 或者实际上不是一个对象,或者f实际上不是一个函数,那么行为是否不同?我想不出一种方法,一个会抛出异常而另一个不会,但是也许我错过了什么......)

编辑:澄清一下:是的,我知道它.call可以用来指定函数看到的值,它在你this不能使用obj.f()语法的情况下很有用(因为f不是obj知道是不是)。我的问题不是关于.call一般情况下的工作方式。我的问题是关于这种.call情况,我看不到使用对象属性语法 的明显原因。

4

1 回答 1

1

两者没有区别。

如果我们检查 正常函数调用的语言规范,然后Function.prototype.call我们可以看到它们的行为完全相同。

即,

x.f.call(x)做这个:

返回调用func的[[Call]]内部方法的结果,提供thisArg作为this值,提供argList作为参数列表。

正常通话的地方:

返回调用 func 的 [[Call]] 内部方法的结果,提供 thisValue 作为 this 值,提供列表 argList 作为参数值。

哪里this有分辨率(在规范中的 11.2.3 7.bi 中指定)。

所有现代 JavaScript 实现(是的,甚至 IE8 现代)都尊重这一点。

于 2013-08-31T17:29:37.020 回答