为什么vars有时候使用或不使用var这么困惑?

时间:2010-10-12 22:53:38

标签: javascript

我真的很困惑,为什么有些vars在命名空间对象中使用时在它们前面声明“var”时不起作用。是不是在每个变量前面添加“var”才能使其保持在全局命名空间之外?

或者在我的命名空间对象中没有先声明“var”的情况下创建任何var,确保这一点,所以我不想担心“var”?

以下是我的代码示例:

MYNAME.DoStuff = {
   initialize: function() {
       var var1 = 'name'; //1
       var2 = 'name'; //2
       this.var3 = 'name'; //3

       var $var4 = $('#' + name); //4
       $var5 = $('#' + name); //5
       this.$var6 = $('#' + name); //6
   },

   linkStuff: function() {
       // then use the vars from the init above in here
   }
}

MYNAME.DoStuff.initialize();

有人能告诉我哪个号码(1,2或3)是正确的吗?是否有我会使用多个或全部的情况?当我需要用jQuery做DOM引用时怎么样?哪种方式正确(4,5或6)?

3 个答案:

答案 0 :(得分:4)

var语句将变量绑定到当前函数的范围,在您的示例中var1只能在initialize内访问。

您的第二个示例var2 = 'name';只是对-possibly- 未声明标识符的分配。

这是反模式,应该避免。如果标识符在范围链中不可解析,var2将最终成为全局对象的属性 - 隐含全局,因为大多数情况下您实际上都试图避免使用全局变量 - 。

此外,新的ECMAScript 5严格模式,完全不允许这种分配,避免它们......

第三个示例this.var3将在当前对象中创建属性,在您的示例中this值为initialize }将引用MYNAME.DoStuff,因为您通过MYNAME.DoStuff.initialize();调用初始化方法。

在第三个示例中,您可以在linkStuff功能上访问此类属性,只需this.var3 - 如果您正确调用linkStuff功能,例如MYNAME.DoStuff.linkStuff(); -

答案 1 :(得分:0)

根据您尝试使用linkStuff方法执行的操作,您可以尝试这样做:

var DoStuff = {
    firstVar: null,
    secondVar: null,

    initialize: function() {
       // set initial values
       this.firstVar = 'name';
       this.secondVar = 'name2';
    },

    linkStuff: function() {
        alert(this.firstVar);  // 'name'
    }
};
var myname = DoStuff;
myname.initialize();
myname.linkStuff();

答案 2 :(得分:0)

正如@CMS所指出的那样,var在当前范围内设置了一个变量。这就是为什么你在函数外部var variablename 创建全局var variablename 内部函数来创建 locals

但是在对象的背景下,还有更多的事情发生。 Javascript有一个叫做闭包的功能,它可以实现非常强大的技巧,比如private, public and privileged methods(我通常不喜欢链接到Crockford因为他有点傲慢的旋钮,但有时候他是一个聪明的旋钮)。

需要注意的另一件事是Javascript对象实际上与大多数其他语言中的对象非常不同。在Javascript中,您不构建它们,而是构建它们。如果您这样做:

function stuff() {
   // Do init code here

   this.linkStuff = function() {
        // Do linkstuff code here
   }
}

...您可以执行myname.dostuff = new stuff(),您的初始化代码将自动运行。这也是获取jQuery对象并将其分配给变量以供以后使用的重点。