我真的很困惑,为什么有些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)?
答案 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对象并将其分配给变量以供以后使用的重点。