我最近看到的代码长这样:
(function (someGlobal) {
someGlobal.DoSomething();
})(someGlobal);
这里的someGlobal是一个大型框架类,可能是JQuery。这样做有什么好处?这是一个好的做法吗?似乎这段代码等效且更少出错,因为你没有隐藏全局变量:
(function () {
someGlobal.DoSomething();
})();
我最近看到的代码长这样:
(function (someGlobal) {
someGlobal.DoSomething();
})(someGlobal);
这里的someGlobal是一个大型框架类,可能是JQuery。这样做有什么好处?这是一个好的做法吗?似乎这段代码等效且更少出错,因为你没有隐藏全局变量:
(function () {
someGlobal.DoSomething();
})();
如果全局引用被覆盖,您可以使用可靠的本地引用
它缩短了访问作用域链的长度
如果您预计全局变量会被覆盖,并且您的代码依赖于被覆盖的值,那么您肯定不希望在函数中使用本地变量来屏蔽它。"It seems like this code would be equivalent and less error prone because you don't hide the global:"
(function () { someGlobal.DoSomething(); })();
如果它是全局变量,为什么要传递呢?直接将其用作全局变量即可。
然而,这似乎可以作为一种有效的过渡机制来消除全局变量。例如,如果我继承了一个有很多全局变量的大型代码库,一个潜在的过渡机制就是逐步消除全局变量的使用方式。这种改变可以通过最小的差异逐步完成。
这样你就可以在安全的作用域中使用别名。
(function ($) {
$.DoSomething();
})(someGlobal);
更新:
最重要的是,这种方式为您定义了一个安全范围,以便您使用someGlobal
。
如果您使用第二种方法,someGlobal
仍然是全局变量,想象一下您在回调函数中使用someGlobal
,并在外部某处覆盖了someGlobal
,会发生什么?
someGlobal
定义一个安全范围。 - xdazzsomeGlobal
就是你传递给它的 someGlobal
。 - xdazz好处是,在该函数内,someGlobal
是明确无误的。
someGlobal
可能会在函数开始和使用之间的中途发生变化。从函数内部代码的角度来看,参数值(或传递的参数引用)不会改变。 - Humberto