正在使用'var'声明变量为可选?

var是可选的吗?

myObj = 1;

和?

var myObj = 1;

我发现它们都从我的测试中工作,我假设var是可选的。对吗?

149269 次浏览
他们的意思不同。 如果你使用var,变量是在你所在的范围内声明的(例如函数)。如果不使用var,变量会在作用域层中向上冒泡,直到遇到给定名称的变量或全局对象(如果在浏览器中操作,则为窗口),然后将其附加到其中。然后将非常相似的转换为全局变量。然而,它仍然可以用delete删除(很可能是其他人的代码也没有使用var)。如果在全局作用域中使用var,则变量为真正意义上的全球,不能被删除

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

var是可选的。var将变量置于局部作用域。如果一个变量没有定义var,则它在全局作用域而且不可删除中。

编辑

我认为不可删除的部分在特定的环境下在某个时间点是正确的。我一定是在做梦。

不,它们不相等。

对于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

第二个函数改变全局变量“external”的值,但第一个函数不会。

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

如果你声明一个没有var关键字的变量,就像这样:

myVar = 100;

它变成了一个全局变量,可以从脚本的任何部分访问。如果你不是故意这样做的,或者没有意识到这一点,如果你在javascript的另一个地方重复使用变量名,它会给你带来痛苦。

如果你用var关键字来声明变量,就像这样:

var myVar = 100;

它是作用域的局部({]-括号,函数,文件,取决于你把它放在哪里)。

这是一种更安全的处理变量的方法。因此,除非你是故意这样做,尽量声明变量与var关键字,而不是没有。

这不仅仅是局部和全局的区别。使用var创建的全局变量与不使用var创建的全局变量不同。考虑一下:

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

根据到目前为止的答案,这些全局变量foobarbaz都是等效的。这是的情况。使用var创建的全局变量被(正确地)分配了内部的[[DontDelete]]属性,这样它们就不能被删除。

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


foo; // 1
bar; // ReferenceError
baz; // ReferenceError

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

这是Javascript最棘手的部分之一,但也是它的核心特性之一。用var声明的变量在你声明它的地方“开始它的生命”。如果你省略了var,这就像你在谈论一个你以前使用过的变量。

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

关于作用域,变量自动变成全局的不< em > < / em >是正确的。相反,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中最重要的事情。

围绕着这个问题有太多的困惑,现有的答案没有一个能清晰直接地涵盖一切。下面是一些内联注释的例子。

//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
}

为了非常清楚地描述正在发生的事情,删除功能分析广泛地涵盖了变量实例化和赋值。

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

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

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

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

Var作为关键字源于语言设计者的错误决定,就像Javascript作为名称源于错误决定一样。

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

看看这个小提琴: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

我刚从一个同事推荐的论坛上找到了答案。如果你在函数外声明一个变量,它总是全局的。不管你是否使用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

撇开范围不谈,它们可以用不同的方式使用。

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

语句和表达式

不,这不是“必需的”,但如果你不这样做,可能会导致重大问题。不使用var定义变量,将该变量置于其所在代码部分的作用域内。如果不这样做,那么它就不包含在该作用域中,并且可以覆盖先前定义的在函数作用域之外的同名变量。