3

我经常看到这种模式

  (function(){}).call(this)

和这个一样吗?

  (function(that){})(this)

提前致谢

编辑

这两个代码是否试图解决同一个问题?是什么背景?

编辑

任何人都可以编辑标题并提供更好的原因,我认为这很有趣。

4

3 回答 3

2

不,不是,另一个给函数一个对象上下文,另一个传递一个没有任何对象上下文的参数。

想象一个通用函数,例如Array#shift()

var shift = Array.prototype.shift;

//Shift expects an object context, and cannot be called without one.


//so this won't work:
shift($("div"))
//undefined

//This does:
shift.call($("div"))
//<div id=​"notify-container">​&lt;/div>​
于 2012-08-08T12:40:35.903 回答
1

这两个代码是否试图解决同一个问题?这是什么背景?

是的,但方式不同。

第一个版本调用Function.prototype.callwhich 作为第一个参数,接受被this调用函数上下文中的变量将引用的上下文对象。

第二个版本只是自调用匿名函数并将引用的对象this(在调用上下文中)传递给匿名函数。现在,在被调用的匿名函数上下文中,我们可以通过that. thiswill be globalor undefined(取决于 ES5 严格模式)

于 2012-08-08T12:47:05.710 回答
1

问题后编辑

不。Function.prototype.call接受this作为它的第一个参数。this在这种情况下,不会作为真正的参数传递给函数。this但是,您可以像that在第二个函数中那样处理实际传递的问题。

编辑:这是一个例子。

MyObject = {};
MyObject.prototype.myMethod = function(value) { console.log("Hello, " + value); }
var obj = new MyObject();

function myMethodCaller(value)
{
    this.myMethod(value);
}

myMethodCaller("World!");
myMethodCaller.call(obj, "World!");
  • 第一次调用将失败并出现错误,因为[隐式] this(接收者)通常是没有该方法的window(更一般地说,全局对象,无论它在您的上下文中是什么。它是不同的,例如工人)myMethod
  • 第二个调用将记录“Hello, World!” 进入您的控制台,因为this将指向,将在其上调用obj该方法。myMethod
于 2012-08-08T12:40:46.497 回答