Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么要将jQuery作为参数传递给(函数($){..})(jQuery)闭包包装器,而不是本地变量?_Javascript_Jquery - Fatal编程技术网

Javascript 为什么要将jQuery作为参数传递给(函数($){..})(jQuery)闭包包装器,而不是本地变量?

Javascript 为什么要将jQuery作为参数传递给(函数($){..})(jQuery)闭包包装器,而不是本地变量?,javascript,jquery,Javascript,Jquery,闭包包装器(函数($){..})(jQuery)是使用局部变量而不是全局变量的好方法。$和包装器中定义的任何变量和局部函数仅在包装器内可见,而不在包装器外可见。这很好,我一直在用它 (function($){ [..] })(jQuery); 然而,我一直在想为什么我们要将jQuery(可能还有其他东西)作为参数传递,而不是使用局部变量声明 (function(){ var $ = jQuery; [..] })(); 这不是很好,而且更透明吗?我认为前一种方法更好的原因是:

闭包包装器
(函数($){..})(jQuery)
是使用局部变量而不是全局变量的好方法。
$
和包装器中定义的任何变量和局部函数仅在包装器内可见,而不在包装器外可见。这很好,我一直在用它

(function($){
  [..]
})(jQuery);
然而,我一直在想为什么我们要将
jQuery
(可能还有其他东西)作为参数传递,而不是使用局部变量声明

(function(){
  var $ = jQuery;
  [..]
})();

这不是很好,而且更透明吗?

我认为前一种方法更好的原因是:

(功能(){
var$=jQuery;
[..]
var jQuery=foo;
})();


在本例中,变量“$”将由于提升而未定义。

在代码长度方面有优势。它保存了几个字符(字节…)。虽然不多,但是如果你必须在这两个选项中进行选择,第一个例子会更短

为了简化,也可以(在某种程度上是常见的)使用“unset”变量作为未定义的匹配,如下所示:

(function(r,u){if(r.missingProp===u)alert('undefined!')})({realProp:1})

由于
u
在调用过程中没有传递值,因此它将等于
未定义的值

,因为您可以传递其他不是jQuery但实现类似接口的内容,例如Zepto。然后对代码的唯一更改是在闭包调用行->
(function($){})(Zepto)
。其他受欢迎的库也是如此——lodash而不是下划线等。你也不会污染全球名称空间。因此,这主要是一个品味和受欢迎程度的问题?@Mjh-我不认为这是一个令人信服的论点,因为同样的改变也可以通过直接分配来实现。@JaredFarrish-你错过了这里的大局。模块装载机以这种方式操作。这是一种在不依赖全局状态的情况下传递依赖项的优雅方式。像jQuery这样的模块不必全局定义,也不必使用标识符。我们可以将jQuery从图片中删除,并使用其他一些流行的库,以便更容易理解。@Mjh在OP中,jQuery必须在这两种情况下都定义为全局的,这里不缺少“污染”。-)不错。通常这种情况不会发生,但通过将其放入参数中,您甚至不需要检查代码中的类似内容。在我看来,这是最小的边缘情况。我总是喜欢不可能的情况而不是不可能的情况,特别是在选择我将在我编写的每一段代码中使用的模式时。我想我只是要回去睡觉了。如果你要达到这些长度,那么:
var jQuery=foo;(函数($){…}(jQuery))
也将失败。这是一个由minifier自动完成的技巧,还是您想手动完成的操作?在前一种情况下,我并不在乎,在后一种情况下,我强烈反对:)是的,它比较短,但从stackoverflow的许多问题来看,它似乎让很多人感到神秘:)@donquixote-我没有试图说服你做任何事:-)。我只是说明为什么有时使用输入参数可以减少代码大小。顺便说一句,你也可以这样做,而不是“实变量”,以节省
变量x,y,z只要这些变量不需要立即初始化。再说一遍,我并不是说这是一种超强的、甚至不争论的理由,但如果你必须在这两种理由中做出选择,我认为这是一种优势,它是一种权衡,清晰与简洁。在这种情况下,我会选择清晰,尊重他人和我未来的自我。
(function($){})(jQuery)
模式有点不同,因为它是如此广泛和熟悉。因为上面提到的@Rafał的观点。
(function(r,u){if(r.missingProp===u)alert('undefined!')})({realProp:1})