如果我用'var'指定变量,我不知道为什么它不起作用: 像这样:
var mytool = function(){
return {
method: function(){}
}
}();
后来我在同一个模板中使用它:mytool.method。这将输出mytool未定义。
但如果我这样定义:
mytool = function(){
return {
method: function(){}
}
}();
然后它有效。
答案 0 :(得分:5)
Javascript具有功能范围。变量在声明的函数范围内,其中还包括您可以在该函数中定义的任何函数。
function () {
var x;
function () {
// x is in scope here
x = 42;
y = 'foo';
}
// x is in scope here
}
// x is out of scope here
// y is in scope here
声明变量时,请使用var
关键字
如果你不使用var
关键字,Javascript将遍历范围链,期望在更高的函数中找到声明的变量。这就是为什么上面x = 42
分配给x
分配的var x
分配给y
高一级的原因。
如果您之前没有声明变量,Javascript将遍历全局对象并为您创建该变量。上面的window.y
变量作为var
附加到全局对象,因此在声明函数之外的范围内。
这很糟糕,你需要避免它。使用{{1}}。
答案 1 :(得分:2)
您拥有的代码不足以证明问题。 var
使变量被定义为“本地”,因此它只能在同一个函数中使用(javascript具有函数级别范围)。不使用var使其成为全局,这几乎总是不是你想要的。您可能需要重新安排代码以修复范围问题。
答案 2 :(得分:2)
我认为你在某个功能中使用了这个:
function setup_mytool() {
var mytool = function(){
return {
method: function(){}
}
}();
}
这会在函数的作用域中创建变量mytool
;当函数setup_mytool
退出时,变量将被销毁。
当函数退出时,说window.mytool
或window.my_global_collection.mytool
将使变量mytool
保持不变。
或者:
var mytool;
function setup_mytool() {
mytool = function(){
return {
method: function(){}
}
}();
}
也会做我认为你想要的事情。
答案 3 :(得分:1)
您获得变量未定义错误的原因是因为当您使用var
时,声明的变量的范围限定为周围的上下文,这意味着变量的生命周期仅限于周围上下文的生命周期(函数,块,whathaveyou)。
但是,如果不使用var
,则您实际上声明了一个与全局范围相关的变量。 (通常是个坏主意)。
因此,在您的代码中,您能够在模板中的其他位置访问mytool
变量的原因是因为您将其绑定到全局范围,在使用var
的情况下,变量超出了范围,因为它必须在函数中声明。