2012-04-25 83 views
1

我正在考虑向JSON添加注释,并发现this script在处理使JSON有效之前将它们除去。我只是想了解如何使JSON.minify()函数可用?(函数(全局){some code ..})(this)中的全局是什么?

它开始

(function(global){ ... 

完全是怪我。我在MDN上发现了“global is a property of a RegExp instance, not the RegExp object”,但我不明白它是如何在这个脚本中工作的。

+1

这是一个参数。 – SLaks 2012-04-25 22:20:25

+0

该函数在全局上下文中调用。因此,'this'参数是分配给'global'参数的全局对象。 – 2012-04-25 22:22:11

回答

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

+0

即使只在浏览器中运行,仍然可能有一点。你可以节省一些字节,因为'global'参数可能是一个字符;每次你引用'window'时保存5个字节。 – josh3736 2012-04-25 22:50:39

+0

@ josh3736 - 我想你说的是微小化。我通常将可读性优先考虑到在缩小之前没有看到我的代码的人,所以我通常不会为了缩小而参与这样的事情。但是,是的,这是个人选择。 – jfriend00 2012-04-25 23:02:26

+0

如果它只是浏览器,只需命名参数'window'(而不是'global')。这样你会得到缩小的好处,但保持可读性 - 你仍然可以编写'window.location'或其他任何东西。实际上,这就是jQuery [做它](http://code.jquery.com/jquery-1.7.2.js) - '(function(window,undefined){...})(window);' – josh3736 2012-04-25 23:12:31

2

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

此代码:

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

定义一个匿名函数取一个参数bar并立即与bar值作为第一个参数调用它。

除了jfriend00在他的正确答案中提到的内容,它也是确保您不会将变量和函数泄漏到外部范围的好方法:如果您在javascript的顶部范围中声明了var baz = 17;,它将是window的财产。如果您按照您提到的模式将其包装在函数中,则只能将属性明确地导出至window - 通过将属性分配给global(就您的示例而言)。作为@ josh3736在他的评论中说,你也可以在没有事先声明的情况下分配给window,例如泄漏给windowquux = 4711;

+0

+1组成一个独特的词。零谷歌点击froozboggles。 – 2012-04-25 22:22:27

+0

不长。 ;-) – 2012-04-25 22:23:08

+0

*“您只能将属性显式导出到窗口”* - 这不完全正确。如果在范围内没有'baz',则纯粹的'baz = ...;'将分配给全局对象('window')。换句话说,'(function(global){baz ='';})(this)'仍然会泄漏'baz',即使它没有明确地分配给window。 – josh3736 2012-04-25 22:53:43