Javascript问题:关于变量定义

时间:2010-11-30 07:07:44

标签: javascript

如果我用'var'指定变量,我不知道为什么它不起作用: 像这样:

var mytool = function(){
      return {
         method: function(){}
     }
}();

后来我在同一个模板中使用它:mytool.method。这将输出mytool未定义。

但如果我这样定义:

     mytool = function(){
          return {
             method: function(){}
         }
    }();

然后它有效。

4 个答案:

答案 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.mytoolwindow.my_global_collection.mytool将使变量mytool保持不变。

或者:

var mytool;

function setup_mytool() {
    mytool = function(){
          return {
             method: function(){}
         }
    }();
}

也会做我认为你想要的事情。

答案 3 :(得分:1)

您获得变量未定义错误的原因是因为当您使用var时,声明的变量的范围限定为周围的上下文,这意味着变量的生命周期仅限于周围上下文的生命周期(函数,块,whathaveyou)。

但是,如果使用var,则您实际上声明了一个与全局范围相关的变量。 (通常是个坏主意)。

因此,在您的代码中,您能够在模板中的其他位置访问mytool变量的原因是因为您将其绑定到全局范围,在使用var的情况下,变量超出了范围,因为它必须在函数中声明。

相关问题