【问题标题】:Why would any body use this pattern? [duplicate]为什么会有人使用这种模式? [复制]
【发布时间】:2014-03-11 06:06:53
【问题描述】:

我在脚本中读过一次,但我不明白它的好处。

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

另外,我试过运行它,

(function () { console.log('Hello World') }).call(this); 

但它没有打印任何东西。

即使调用此(function () { console.log('Hello World') })() 也没有打印任何内容。怎么了?

【问题讨论】:

  • 运行时会打印Hello World,在firebug控制台上试了一下。
  • 我在控制台上运行它..但没有打印出来。
  • jsfiddle.net/dublinan/QvJJt 例如,如果您在谷歌浏览器中打开此页面,然后右键单击页面上的任意位置并检查元素 -> 控制台,您可以看到输出。
  • 这是健全的代码。如果您在浏览器的控制台中运行它,它将打印 Hello World。
  • 对我来说很好。这是一个[自执行匿名函数][1] [1]:stackoverflow.com/questions/592396/…

标签: javascript


【解决方案1】:

当我希望我的代码在浏览器窗口中运行时,我使用this(在这种情况下this 指的是windowweb worker(在这种情况下@ 987654325@ 指的是工作实例)。

.call(this) 对此非常有效,当然您也可以采用不同的方式。例如,这也可以:

(function(root) {

    root.MyLibrary = MyLibrary;

}(this));

与往常一样,给众所周知的猫剥皮的方法不止一种。

【讨论】:

  • webworker 中它会引用self,不是吗?
  • @Xotic750 根据我在网络工作者中的经验,selfthis 指的是同一个(工作者)对象。老实说,我不确定他们为什么介绍self...
  • 可能与"use strict";有关? ://
【解决方案2】:

可能作者想要更改 IIFE 的上下文。传递this 将毫无意义,因为即使没有call,它也会引用window

这样的事情会改变this在范围内的含义:

(function () { console.log('Hello World', this) }).call({foo:1});

但是,我还是不明白这一点,因为你不妨这样做:

(function (fooObj) { console.log('Hello World', fooObj) })({foo:1});

我想说的是更常见的。

【讨论】:

  • 你假设它是在全局环境中执行的。
  • @cookiemonster 好吧,没有 OP 的任何更好解释,只能假设是这种情况
  • 为什么?没有必要做出这样的假设。至于答案的第二部分,请考虑 JS 正在获得具有词法定义的 this 的新函数语法,这将使封闭的 this 值可能很重要。
  • @cookiemonster 无论如何,您仍然可以将 this 作为参数传递给 IIFE。使用call 调用已经自调用的东西是错误的。
  • 这远非“错误”。并且使用新的函数语法,如果您希望函数具有封闭的 this 值,则将是必要的。作为参数传递也无济于事。
猜你喜欢
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
相关资源
最近更新 更多