Javascript 为什么变量有时使用或不使用变量?

Javascript 为什么变量有时使用或不使用变量?,javascript,Javascript,我真的很困惑,为什么有时变量在名称空间对象中使用时,在它们前面声明var时,它们就不能工作了。在每个变量前面添加var不是将其保持在全局命名空间之外的正确做法吗 或者在我的命名空间对象中创建任何var而不首先声明var,可以确保这一点,所以我不需要担心var吗 下面是我的代码示例: MYNAME.DoStuff = { initialize: function() { var var1 = 'name'; //1 var2 = 'name'; //2

我真的很困惑,为什么有时变量在名称空间对象中使用时,在它们前面声明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();

有人能告诉我哪一个数字是正确的吗?是否存在我会使用多个或全部的情况?当我需要使用jQuery进行DOM引用时,怎么样?哪种方法是正确的4、5或6?

根据您在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();

根据您在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();
var语句将变量绑定到当前函数的作用域,在您的示例中,var1只能在initialize中访问

第二个示例,var2='name';只是对可能未声明的标识符进行赋值

这是一种反模式,应该避免。如果标识符在作用域链的更高层不可解析,那么var2最终将成为全局对象的一个属性—一个隐含的全局对象,因为大多数时候您实际上都试图避免全局对象

此外,新的ECMAScript 5严格模式,完全不允许这种赋值,请避免它们

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

在第三个示例中,您可以通过this.var3访问linkStuff函数上的此类属性-如果您正确调用该linkStuff函数,例如MYNAME.DoStuff.linkStuff;-

var语句将变量绑定到当前函数的作用域,在您的示例中,var1只能在initialize中访问

第二个示例,var2='name';只是对可能未声明的标识符进行赋值

这是一种反模式,应该避免。如果标识符在作用域链的更高层不可解析,那么var2最终将成为全局对象的一个属性—一个隐含的全局对象,因为大多数时候您实际上都试图避免全局对象

此外,新的ECMAScript 5严格模式,完全不允许这种赋值,请避免它们

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

在第三个示例中,您可以通过this.var3访问linkStuff函数上的此类属性-如果您正确调用该linkStuff函数,例如MYNAME.DoStuff.linkStuff;-

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

但是在对象的上下文中,还有更多的内容。Javascript有一个叫做闭包的特性,它支持非常强大的技巧,比如我通常不喜欢链接到Crockford,因为他有点傲慢,但有时他是个聪明的人

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

function stuff() {
   // Do init code here

   this.linkStuff = function() {
        // Do linkstuff code here
   }
}
。。。您可以执行myname.dostuff=新建操作,初始化代码将自动运行。这也是获取jQuery对象并将其分配给变量以供以后使用的点。

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

但是在对象的上下文中,还有更多的内容。Javascript有一个叫做闭包的特性,它支持非常强大的技巧,比如我通常不喜欢链接到Crockford,因为他有点傲慢,但有时他是个聪明的人

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

function stuff() {
   // Do init code here

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

。。。您可以执行myname.dostuff=新建操作,初始化代码将自动运行。这也是获取jQuery对象并将其分配给变量以供以后使用的关键所在。

因此,如果我想在定义变量时使用jQuery对元素进行DOM引用,该怎么办?以firstVar为例,我是否需要更改它。firstVar='name';到这个。$firstVar=$'name';?这似乎是我现在需要的东西
在脚本中重复使用方法中的变量,但是看到这个看起来很奇怪。$firstVar。我只是想找到一个好方法,不必使用jQuery获取元素5x,只需在脚本顶部获取一次。使用$作为包含jQuery对象的变量的前缀是常见的做法,因此我理解您为什么要使用它。是的,这个。$firstVar看起来很奇怪,但你可能会习惯它。如果您不这样做,您可以总是在它前面加上其他前缀:this.j_firstVar,也许?那么,如果我想在定义变量时使用jQuery对元素进行DOM引用,该怎么办?以firstVar为例,我是否需要更改它。firstVar='name';到这个。$firstVar=$'name';?当我需要在脚本中的方法中重用变量时,这似乎是目前对我有效的方法,但看到这一点看起来很奇怪。$firstVar。我只是想找到一个好方法,不必使用jQuery获取元素5x,只需在脚本顶部获取一次。使用$作为包含jQuery对象的变量的前缀是常见的做法,因此我理解您为什么要使用它。是的,这个。$firstVar看起来很奇怪,但你可能会习惯它。如果您不这样做,您总是可以在它前面加上其他的前缀:this.j_firstVar,也许?