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 = 1
和x = 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)?