注意:__:这个问题是从ECMAScript版本3或5的角度提出的。随着发布ECMAScript 6的新特性的引入,答案可能会过时。
var关键字在JavaScript中的确切功能是什么?
var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;和
someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;你什么时候会使用这两种方法,为什么/它能做什么?
发布于 2009-09-24 08:55:47
如果你在全球范围内,那就没有太大的区别了。阅读康阿克斯氏病答案以获得解释
如果您在一个函数中,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发布于 2009-09-24 13:38:36
有一个不同的。
var x = 1 在当前作用域(也称为执行上下文)中声明变量 x。如果声明出现在函数中,则声明局部变量;如果声明在全局范围内,则声明全局变量。
另一方面,x = 1仅仅是一种财产转让。它首先尝试解决针对作用域链的x。如果它在该作用域链中的任何位置找到它,它将执行赋值;如果它没有找到x,那么只有才会在全局对象(它是作用域链中的顶级对象)上创建属性。
现在,注意它没有声明一个全局变量,而是创建了一个全局属性。
这两者之间的区别是微妙的,而且可能令人困惑,除非您理解变量声明也会创建属性(仅在变量对象上),并且Javascript中的每个属性(好,ECMAScript)都有描述其属性的特定标志- ReadOnly、DontEnum和DontDelete。
由于变量声明创建带有DontDelete标志的属性,所以var x = 1和x = 1 (在全局范围内执行时)的区别是,前者--变量声明--创建DontDelete‘’able属性,而后者没有。因此,通过这个隐式赋值创建的属性可以从全局对象中删除,而前一个属性--通过变量声明创建的属性--不能被删除。
当然,这只是理论,而在实践中,由于实现中的各种缺陷(例如来自IE的But ),两个之间的差异更大。
希望这一切都有意义:)
更新2010/12/16
在ES5 (ECMAScript 5;最近标准化的,第5版语言)中,有一种所谓的“严格模式”--一种选择式语言模式,它轻微地改变了未声明的作业的行为。在严格模式下,分配给未声明标识符的是ReferenceError.。这样做的理由是为了捕捉意外分配,防止创建不想要的全局属性。一些较新的浏览器已经开始滚动支持严格模式。参见,例如,我的复式桌子。
发布于 2009-09-24 09:50:34
说这是“和global”的区别并不完全准确。
最好把它看作是"local和“之间的区别。最接近的当然可以是全球性的,但情况并不总是如此。
/* 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;
}
}https://stackoverflow.com/questions/1470488
复制相似问题