我最近看到的代码看起来像这样:将全局变量传递给函数是否有价值?
(function (someGlobal) {
someGlobal.DoSomething();
})(someGlobal);
其中someGlobal是一个大的框架类。它可能是JQuery。这样做的好处是什么?这是一个好习惯吗?似乎这样的代码就相当于且不易出错,因为你不躲全球:
(function() {
someGlobal.DoSomething();
})();
我最近看到的代码看起来像这样:将全局变量传递给函数是否有价值?
(function (someGlobal) {
someGlobal.DoSomething();
})(someGlobal);
其中someGlobal是一个大的框架类。它可能是JQuery。这样做的好处是什么?这是一个好习惯吗?似乎这样的代码就相当于且不易出错,因为你不躲全球:
(function() {
someGlobal.DoSomething();
})();
你的情况下,可靠的参考全球的一个被覆盖
它缩短了作用域链来访问它
“这样看来,代码将是等效的,并且不太容易出错,因为您不隐藏全局代码:“
(function() { someGlobal.DoSomething(); })();
如果预计全球被覆盖,而你的代码依靠被覆盖的值,那么显然你不希望通过函数中的局部变量影子吧。
除此之外,函数中的本地引用不应该更容易出错。
的好处是,该函数内,someGlobal
是毫不含糊的。
它是如何比引用它作为参数传入时更明确?如果你不知道这个功能是什么,你就不会知道呼叫站点是什么。 – 2012-02-01 02:28:40
@SteveRowe,这种模式在更广泛的场景中更为有用,在这些场景中,调用站点与函数声明“遥远”并且涉及到闭包。正如其他人最好说的那样,'someGlobal'可能会在功能开始和使用之间的中间变化。从函数内代码的角度来看,参数值(或传递的参数的引用)不会改变。 – Humberto 2012-02-01 03:01:16
这样您就可以在安全范围内使用别名。
(function ($) {
$.DoSomething();
})(someGlobal);
更新:
最进口事情是这样定义的安全范围供您使用someGlobal
。
如果使用第二种方式中,someGlobal
仍然是你在一个回调函数使用someGlobal
一个全球性的,只是成像和您覆盖someGlobal
之外的某处,会发生什么?
这将是一个好处,但在这种情况下,他们使用完全相同的名称。 – 2012-02-01 02:08:31
@SteveRowe是的,除此之外,更重要的是为您定义一个安全的范围,使用'someGlobal'。 – xdazz 2012-02-01 02:11:23
尝试在这里了解。如果该函数只被调用一次(注意引用没有被捕获到,并且它是匿名的),那么这个安全范围是否有帮助?即使它被多次调用,有没有像JQuery/$这样的东西会被覆盖的真正危险? – 2012-02-01 02:31:40
我同意如果它是一个全局变量那么为什么要通过它?只是把它用作全球性的。
但是看起来好像这可能是一个有效的过渡机制来移除全局。例如,如果我继承了大量的全局代码库,那么一个潜在的转换机制就是以这种确切的方式慢慢消除全局用法。这种改变可以用最小的差异以增量方式完成。
1.只有在**肯定**的情况下,代码才会在覆盖全局之前执行。 2.只有一个范围对象,所以增益很小(因为编译器可能在函数实例化时优化范围链)。所以好处很小。 – RobG 2012-02-01 02:33:10
@RobG:1.那么如果它不是先执行,那么就有一个问题需要解决。我们完全可以说*“只有当你确定全球存在于第一位时”*,但那不是重点,不是吗?如果全局被覆盖,那么IIFE问题就没有意义了。是的,一个小的性能增益。 – 2012-02-01 02:54:55
准备在它所依赖的全局变量的环境中运行的代码可能会在不知道它是在代码之前还是之后运行的环境中进行重新分配。在这种情况下,传入全球并不能确定它没有被重新分配。毕竟,这不是全局的问题吗? – RobG 2012-02-01 04:07:13