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

注意 :这个问题是从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;

你什么时候会使用其中一种,为什么?它有什么作用?


如果你在全球范围内,那么没有区别。

如果你在一个函数中,那么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

有一个区别

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

另一方面, x = 1仅仅是一种财产分配。 它首先试图根据作用域链来解析x 。 如果它在该范围链中的任何地方找到它,它将执行分配; 如果它没有找到x ,那么才会在全局对象 (这是作用域链中的顶级对象) 上创建x属性

现在注意它没有声明一个全局变量,它创建了一个全局属性。

两者之间的区别很微妙,除非您明白变量声明也创建属性 (仅在变量对象上),并且Javascript中的每个属性(以及ECMAScript)都具有描述其属性的特定标志 - ReadOnly,DontEnum和DontDelete。

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

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

希望这一切都有道理:)


[2010/12/16更新]

在ES5(ECMAScript 5;最近标准化,第5版的语言)中,有一个所谓的“严格模式” - 一种选择语言模式,它略微改变了未声明的作业行为。 在严格模式下,分配给未声明的标识符是一个ReferenceError 。 其理由是要抓住意外的任务,防止产生不希望的全球性质。 一些较新的浏览器已经开始支持严格模式。 例如,参见我的compat表。


说“ 地方全球 ”之间的区别并不完全准确。

把它看作“ 本地最近 ”之间的区别可能会更好。 离得最近的人肯定是全球性的,但事实并非总是如此。

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}
链接地址: http://www.djcxy.com/p/351.html

上一篇: What is the purpose of the var keyword and when should I use it (or omit it)?

下一篇: Difference between a method and a function