var关键字的用途是什么,我应该何时使用它(或省略它)?

2022-08-29 22:00:09

注意:这个问题是从 ECMAScript 版本 3 或 5 的角度提出的。随着 ECMAScript 6 版本中引入新功能,答案可能会过时。

JavaScript中关键字的功能究竟是什么,两者之间有什么区别var

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

你什么时候会使用其中任何一个,为什么/它做什么?


答案 1

如果你处于全局范围内,那么就没有太大的区别了。阅读Kangax的答案进行解释

如果你在一个函数中,那么var将创建一个局部变量,“no var”将查找作用域链,直到它找到该变量或命中全局作用域(此时它将创建它):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

如果您没有完成作业,则需要使用:var

var x; // Declare x

答案 2

这是有区别的

var x = 1 在当前作用域(也称为执行上下文)中声明变量。如果声明出现在函数中 - 声明局部变量;如果它在全局范围内 - 声明一个全局变量。x

x = 1另一方面,它只是一种财产转让。它首先尝试针对作用域链进行解析。如果它在该作用域链中的任何位置找到它,它将执行分配;如果它找不到 ,则只有在全局对象(它是作用域链中的顶级对象)上创建 x 属性xx

现在,请注意,它不声明全局变量,而是创建全局属性。

两者之间的区别很微妙,可能会令人困惑,除非您了解变量声明也会创建属性(仅在变量对象上),并且Javascript中的每个属性(好吧,ECMAScript)都有某些描述其属性的标志 - ReadOnly,DontEnum和DontDelete。

由于变量声明使用 DontDelete 标志创建属性,因此 和(在全局范围内执行时)之间的区别在于前者 ( 变量声明 - 创建 DontDelete'able 属性,而后者则不创建。因此,通过此隐式赋值创建的属性可以从全局对象中删除,并且无法删除前一个属性(通过变量声明创建的属性)。var x = 1x = 1

但这当然只是理论,在实践中,由于实现中的各种错误(例如来自IE的错误),两者之间还有更多的差异

希望这一切都有意义:)


[更新日期 2010/12/16]

在ES5(ECMAScript 5;最近标准化的第5版语言)中,有一个所谓的“严格模式”——一种选择加入的语言模式,它稍微改变了未声明的赋值的行为。在严格模式下,分配给未声明的标识符是引用错误。这样做的理由是捕获意外赋值,防止创建不需要的全局属性。一些较新的浏览器已经开始滚动支持严格模式。例如,请参阅我的兼容表