1

我正在考虑向 JSON 添加注释,并发现这个脚本在处理使 JSON 有效之前将它们剥离。我只是想了解如何使 JSON.minify() 函数可用?

它开始于

(function(global){ ...

这对我来说很奇怪。我在 MDN 上发现“全局是 RegExp 实例的属性,而不是 RegExp 对象”,但我完全不明白它在这个脚本中是如何工作的。

4

2 回答 2

2

这个片段:

(function(global){
   // your code here
   // referring to the variable named "global" in this scope 
   // will be a reference to the default javascript global object
})(this);

是一个构造,用于将全局对象(无论它可能是什么)分配给一个标记global为这个自执行函数内部的所有代码的参数。

自执行函数用于定义单独的执行范围,以便您在此其他范围内定义的任何函数或变量都不会干扰或可从此范围外直接访问(将您的范围与其他代码范围隔离)。

在浏览器中,全局对象就是window对象,但是如果您打算拥有可能在全局对象可能不存在的其他 javascript 环境(例如服务器上没有 node.js)中工作的代码window,这是一种提取默认值的全局值this,将其放入另一个变量中,然后您可以在代码块中的任何位置引用该变量。

对于仅在浏览器中运行的代码,这确实没有意义。您可以window在需要全局对象时参考。

于 2012-04-25T22:19:20.757 回答
2

它只是一个函数参数名称。它也可能是froozboggles

这段代码:

(function(foo) {
    // In here, what's called "bar" in the outer scope is called "foo"
})(bar);

定义一个接受一个参数的匿名函数,bar并立即以bar第一个参数的值调用它。

除了 jfriend00 在他的好回答中提到的内容之外,这也是确保您不会将变量和函数泄漏到外部范围的好方法:如果您var baz = 17;在 javascript 的顶级范围中声明,它将是一个属性的window。如果您将其包装在您提到的模式中的函数中,则只能将属性window显式导出为 -global在您的示例中,通过将它们分配给 。编辑:正如@josh3736 在他的评论中所说,您也可以window通过在没有先前声明的情况下分配来泄漏,例如quux = 4711;.

于 2012-04-25T22:20:52.893 回答