代码之家  ›  专栏  ›  技术社区  ›  Ray Lu

是否使用“var”声明变量是可选的?[复制品]

  •  335
  • Ray Lu  · 技术社区  · 14 年前

    “var”是可选的吗?

    myObj = 1;
    

    等同于?

    var myObj = 1;
    

    我想,我发现它们都是我测试的结果 var 是可选的。对吗?

    14 回复  |  直到 8 年前
        1
  •  543
  •   Bruno Bronosky    12 年前

    他们的意思不同。 如果你使用 var 变量声明在您所在的范围内(例如函数的范围)。如果你不使用 变量 ,该变量在作用域的各个层中冒泡,直到它遇到给定名称的变量或全局对象(窗口,如果在浏览器中执行此操作),然后在其中附加。那时 非常相似 到全局变量。但是,它仍然可以用删除 delete (很可能是其他人的代码也没有使用 var )如果你使用 var 在全局范围内,变量是 真正全球化 不能删除。

    在我看来,这是JavaScript最危险的问题之一,应该被弃用,或者至少对警告提出警告。原因是,很容易忘记 var 并意外地将一个公共变量名绑定到全局对象。这会产生奇怪且难以调试的行为。

        2
  •  116
  •   deceze    14 年前

    这是JavaScript的一个复杂部分,也是它的核心功能之一。变量声明为 var “开始它的生命”就在你宣布它的地方。如果你把 var 就像你说的是你以前用过的变量。

    var foo = 'first time use';
    foo = 'second time use';
    

    关于范围,它是 变量会自动变为全局变量。相反,javascript将遍历作用域链,以查看您以前是否使用过该变量。如果它找到一个以前使用过的同名变量的实例,那么它将使用这个实例以及在其中声明的任何范围。如果它在任何地方都没有遇到变量,它最终都会碰到全局对象( window 在浏览器中),并将变量附加到它。

    var foo = "I'm global";
    var bar = "So am I";
    
    function () {
        var foo = "I'm local, the previous 'foo' didn't notice a thing";
        var baz = "I'm local, too";
    
        function () {
            var foo = "I'm even more local, all three 'foos' have different values";
            baz = "I just changed 'baz' one scope higher, but it's still not global";
            bar = "I just changed the global 'bar' variable";
            xyz = "I just created a new global variable";
        }
    }
    

    这种行为在与嵌套函数和回调一起使用时非常强大。了解什么 functions 以及范围如何工作是JavaScript中最重要的事情。

        3
  •  77
  •   lietus    12 年前

    不,它们不是等价的。

    myObj = 1; 您使用的是全局变量。

    后一个声明创建了一个您正在使用的作用域的局部变量。

    请尝试以下代码以了解差异:

    external = 5;
    function firsttry() {
      var external = 6;
      alert("first Try: " + external);
    }
    
    function secondtry() {
      external = 7;
      alert("second Try: " + external);
    }
    
    alert(external); // Prints 5
    firsttry(); // Prints 6
    alert(external); // Prints 5
    secondtry(); // Prints 7
    alert(external); // Prints 7
    

    第二个函数改变了全局变量“外部”的值,但第一个函数没有。

        4
  •  21
  •   bcherry    14 年前

    不仅仅是本地和全球。使用创建的全局变量 var 与那些没有的不同。考虑一下:

    var foo = 1; // declared properly
    bar = 2; // implied global
    window.baz = 3; // global via window object
    

    根据目前的答案,这些全局变量, foo , bar baz 都是等效的。这是 案件。全局变量 var 被(正确地)分配给内部 [[DontDelete]] 属性,以便无法删除它们。

    delete foo; // false
    delete bar; // true
    delete baz; // true
    
    foo; // 1
    bar; // ReferenceError
    baz; // ReferenceError
    

    这就是为什么你应该 总是 使用 var ,即使对于全局变量也是如此。

        5
  •  14
  •   kzh    10 年前

    var 是可选的。 var 将变量放入本地范围。如果定义的变量没有 var ,在全球范围内 不可删除 .

    编辑

    我认为不可删除的部分在某个时间点上是真实的,在某个环境中。我一定是梦到了。

        6
  •  13
  •   Steve Kallestad    11 年前

    关于这个问题有太多的困惑,现有的答案没有一个能清楚、直接地涵盖一切。下面是一些内嵌注释的示例。

    //this is a declaration
    var foo;
    
    //this is an assignment
    bar = 3;
    
    //this is a declaration and an assignment
    var dual = 5;
    

    声明设置DontDelete标志。任务没有。

    声明将该变量绑定到当前作用域。

    已分配但未声明的变量将查找要附加到的范围。这意味着它将遍历作用域的食物链,直到找到同名的变量为止。如果找不到,它将附加到顶级作用域(通常称为全局作用域)。

    function example(){
      //is a member of the scope defined by the function example
      var foo;
    
      //this function is also part of the scope of the function example
      var bar = function(){
         foo = 12; // traverses scope and assigns example.foo to 12
      }
    }
    
    function something_different(){
         foo = 15; // traverses scope and assigns global.foo to 15
    }
    

    为了非常清楚地描述正在发生的事情, analysis of the delete function 广泛涉及变量实例化和赋值。

        7
  •  8
  •   Milk Man    10 年前

    看看这个小提琴: http://jsfiddle.net/GWr6Z/2/

    function doMe(){
    
    a = "123"; // will be global
    var b = "321"; // local to doMe
    alert("a:"+a+"  --  b:"+b);
    
    b = "something else"; // still local (not global)
    alert("a:"+a+"  --  b:"+b);
    
    };
    
    
    doMe()
    alert("a:"+a+"  --  b:"+b); // `b` will not be defined, check console.log
    
        8
  •  7
  •   SLaks    14 年前

    They are not the same.

    未声明的变量(没有 var )被视为全局对象的属性。(通常 window 对象,除非您在 with 方块)

    变量声明为 变量 是正常的局部变量,在声明它们的函数之外不可见。(注意,javascript没有块范围)

        9
  •  6
  •   Cyril Gupta    14 年前

    javascript中的var关键字是有目的的。

    如果声明一个没有var关键字的变量,如下所示:

    myVar = 100;
    

    它成为一个全局变量,可以从脚本的任何部分访问。如果您不是故意这样做或者不知道,如果您在JavaScript的另一个地方重新使用变量名,可能会导致您的痛苦。

    如果用var关键字声明变量,如下所示:

    var myVar = 100;
    

    它是作用域的局部(]—大括号、函数、文件,具体取决于放置位置)。

    这是一种更安全的处理变量的方法。因此,除非您是故意这样做的,否则尝试使用var关键字声明变量,而不是不使用var关键字。

        10
  •  4
  •   Community Romance    7 年前

    考虑一下今天StackOverflow上提出的这个问题:

    Simple Javascript question

    一个好的测试和 实例 在上面的场景中会发生什么…
    开发人员在他的一个变量中使用了javascript函数的名称。

    代码有什么问题?
    该代码只在用户第一次单击按钮时工作。

    解决办法是什么?
    添加 var 关键字在变量名之前。

        11
  •  4
  •   Ken Ubleevit    11 年前

    var 不允许程序员声明变量,因为javascript没有变量。javascript有对象。 var 显式向未定义的对象声明名称。赋值将名称作为句柄分配给已给定值的对象。

    使用 var 告诉javascript解释器两件事:

    1. 不使用 代表团 名称的反向遍历查找值,而使用此值
    2. 不删除 名字

    省略 var 告诉javascript解释器使用第一个找到的同名对象的前一个实例。

    var作为关键字源于语言设计者的错误决策,这与javascript作为名称源于错误决策的方式非常相似。

    ps.学习上面的代码示例。

        12
  •  0
  •   Codebling Jelly Bean    9 年前

    除了范围之外的所有内容,它们可以被不同地使用。

    console.out(var myObj=1);
    //SyntaxError: Unexpected token var
    console.out(myObj=1);
    //1
    

    陈述与表达

        13
  •  0
  •   Timothy Trousdale    9 年前

    不,它不是“必需的”,但如果您不这样做,它也可能会导致严重的问题。不使用var定义变量会将该变量放在它所在的代码部分的范围内。如果没有,则它不包含在该作用域中,并且可以覆盖先前定义的变量,这些变量的名称与您所在函数作用域之外的名称相同。

        14
  •  -3
  •   Mogsdad    8 年前

    我刚从一位同事推荐的论坛上找到答案。如果在函数外部声明一个变量,它总是全局的。无论您是否使用var关键字。但是,如果在函数中声明变量,它有很大的区别。在函数内部,如果使用var关键字声明变量,它将是本地的,但是如果不使用var关键字声明变量,它将是全局的。它可以覆盖以前声明的变量。见更多: http://forum.webdeveloperszone.com/question/what-is-the-difference-between-using-var-keyword-or-not-using-var-during-variable-declaration/#sthash.xNnLrwc3.dpuf