4

我遇到了代码变量名称相互冲突的问题,即;

<script type="text/javascript">var a = "hello"; </script>
<script type="text/javascript">alert(a);//this works, when I want 'a' not to exist </script>

关闭是唯一的选择吗?

来自ac#背景,就像是构造一个未引用的delegate实例,然后调用它inline,看起来有点乱

(function(){var a = "hello";})();
(function(){alert(a);})();//yes! working as expected
4

5 回答 5

6

使用(立即自动执行的)函数来创建一个新的范围确实是要走的路。

这还有一个好处是您可以确保某些变量具有某些值。使用 jQuery 时,以下是常见的示例:

(function($, window, undefined) {
    // ...
})(jQuery, this);

除非您有大量函数,每个函数中只有一个语句(如您的示例中),否则它也是完全可读的。

于 2012-06-12T14:47:05.077 回答
5

是的,关闭是您唯一的选择。在浏览器中,所有 JavaScript 文件都放在同一个全局范围内。

IIFE在 JavaScript中常见。我不会称它们为乱七八糟的。

于 2012-06-12T14:46:46.387 回答
2

Javascript具有函数作用域,与具有块作用域的 C# 不同。以下代码是有效的 javascript 和 C#:

var x = 2;
while(true) {
    var y = 3;
    break;
}
//y is not accessible here in C#, but is in javascript

创建新范围的唯一方法是创建并执行匿名函数。

于 2012-06-12T14:52:02.830 回答
0

简而言之,内联的东西,那么你最好使用模块模式来创建一个闭包,从而模拟私有变量。

(function(){
    var a....
    })();

更好的长期方法是将对象用作命名空间。

var NS = {};
NS.a = 1;
于 2012-06-12T14:51:34.497 回答
0

只是提供一个不同的视角。可以在不使用闭包的情况下编写代码,并维护(可以说)安全的全局变量范围。

  1. 定义一个对象,用作命名空间,具有适当的唯一名称(例如 MyAppContext),该名称将具有全局范围,如果您需要定义仅在您的应用程序中使用的类全局变量,请将它们附加到此对象。

    MyAppContext.appTitle = '应用程序标题';

  2. 在您创建的脚本的开头MyAppContect确保它不存在。

  3. 确保所有函数范围的变量都使用var关键字,这样你就知道你没有引用全局值。

显然,这种方法会带来一个风险,即您忘记使用var. JSLint可以在这方面为您提供帮助。

如果我开始被激怒,我很高兴收回这个答案,但我相信这是使用闭包的可行替代方法。嘿!这是老学校

我也同意使用闭包更安全,但认为这可能会让你感兴趣。

于 2012-06-12T15:12:38.560 回答