清除我对这种 js 模式的想法

Clear my mind on this js pattern

本文关键字:模式 js 清除      更新时间:2023-09-26

我经常看到这种模式

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

这个也一样吗?

  (function(that){})(this)

提前致谢

编辑

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

编辑

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

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

想象一个泛型函数,如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">​</div>​

在问题之后编辑

不。Function.prototype.call 接受 this 作为其第一个参数。 在这种情况下,this不会作为实际参数传递到函数中。但是,您可以在第二个函数中that将实际传递的this进行寻址。

编辑:这是一个示例。

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将指向 objmyMethod 方法将在其上调用。

这两个代码是否试图解决同一个问题? 的上下文 这?

是的,但方式不同。

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

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