我已经看到了同样的代码,并且想知道它们之间是否有任何权衡。
方法1:
UIStackView
方法2:
(function(i) {
// Do something to i now
}(global_variable))
为什么要将全局变量传递给函数,如果它仍然存在于该范围内?
答案 0 :(得分:3)
在这种情况下,它给出了明确的说明,即此函数使用全局并创建更容易键入的别名。此外,它使访问变量的速度更快,因为它不需要搜索所有范围,直到它在全局范围内找到它。
对于常规函数,而不是示例中的iife,它会使您的函数更易于测试,因为您可以更轻松地模拟传递的全局函数。
答案 1 :(得分:1)
出于别名的目的,例如:
(function(leeloo){
//inside here you can use the short term
})(LeeloominaiLekataribaLaminaTchaiEkbatDeSebat)
//this would be similar, it's a matter of preference
(function(){
var leeloo = LeeloominaiLekataribaLaminaTchaiEkbatDeSebat;
//...
})()
或包含一个值,如下例所示:
(function($){
//in here, $ preserves the passed/injected value,
//even if the global value changes
})(jQuery.noConflict())
这样你甚至可以在同一页面中使用多个版本的jQuery。
答案 2 :(得分:1)
如果您因某些原因不想永久更改global_variable
的值,可能需要使用第一个示例。例如。执行此代码后,本地副本将被更改,但全局变量将保持不变。
global_variable=true; (function(i){ i=false; return i; }(global_variable));
但是,此代码显然会改变global_variable
:
global_variable=true; (function(){ global_variable=false; }());
编辑:有些切线,这种变化看起来像是改变了全局变量,但它并不是因为调用函数会创建全局变量的卷影副本。您可能应该避免使用此模式,因为它可能会产生混淆:
g=true; (function(g){ g=false; return g; }(g));