我看到一些自动执行函数,其中全局变量作为参数传递,即使全局变量可以在函数内部访问。
var MyApp = {}; (function(app) { //Do something with app varaible. })(MyApp);
有没有理由通过参数将它们传递给函数?
答案 0 :(得分:2)
函数参数以及在函数范围内使用var
声明的变量在本地作用域,并为外部作用域中的同一变量的任何值设置阴影。
在您的示例中,这允许$
具有函数之外的值,并且仅在函数内部临时切换到jQuery
对象。
$ = "stuff";
console.log($); // "stuff"
(function($) {
console.log($); // the jQuery object
})(jQuery);
console.log($); // "stuff"
答案 1 :(得分:2)
考虑使用jQuery的初始代码:
只是为了帮助编写代码,一些程序员沉迷于$,所以他们将jQuery作为参数传递并称之为$。这个代码是一个更好的方式来做这个$ = jQuery,在代码中,其他框架已经用户$,$ = jQuery会覆盖其他API代码......当你使用jQuery和其他冲突的库时,你通常会看到那种代码构造这迫使你调用jQuery.noConflict()。
jQuery.noConflict()删除你之前能够执行此操作的$ functions($ div')...所以要像以前一样继续使用$,在代码中你知道$应该是jQuery然后你声明代码如:
(function($){
...
})(jQuery);
关于一般的关闭:
这在其他情况下很有用,想象一下使用jquery $变量工作的巨大函数,然后你向你的项目中添加一个与$冲突的库,上面的闭包将帮助你不重写代码,你可以将其包装在用户内部的封闭内。
还有一件事,为了清晰,(function(){})()被称为闭包,因为你声明了一个匿名函数然后你执行它,这意味着你在该函数内创建一个私有上下文。
关于闭包的链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures
将globals作为参数传递给闭包的原因是,当您将全局变量作为参数传递给locals时,您只将该全局变量重命名为闭包上下文中的另一个名称。这是一种可控制的说法,“嘿,这里jQuery被称为$和jQuery”。