“var”是可选的吗?
myObj = 1;
与...一样 ?
var myObj = 1;
我发现它们都在我的测试中工作,我认为var
是可选的。是对的吗?
“var”是可选的吗?
myObj = 1;
与...一样 ?
var myObj = 1;
我发现它们都在我的测试中工作,我认为var
是可选的。是对的吗?
它们的意思不同。如果您使用var
变量在您所在的范围内声明(例如函数)。如果您不使用var
,则变量会在作用域层中冒泡,直到遇到给定名称的变量或全局对象(窗口,如果您在浏览器中执行此操作),然后将其附加到此处。它非常类似于全局变量。但是,它仍然可以被删除delete
(很可能被其他人的代码也没有使用var
)。如果var
在全局作用域中使用,该变量是真正的全局变量,不能删除。
在我看来,这是 javascript 中最危险的问题之一,应该弃用,或者至少对警告提出警告。原因是,很容易忘记var
并意外地将公共变量名称绑定到全局对象。这会产生奇怪且难以调试的行为。
这是 Javascript 的棘手部分之一,但也是其核心功能之一。一个用var
“开始它的生命”声明的变量就在你声明它的地方。如果您省略var
,就好像您在谈论您以前使用过的变量。
var foo = 'first time use';
foo = 'second time use';
关于作用域,变量自动变为全局是不正确的。相反,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 中最重要的事情。
不,它们不是等价的。
随着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”的值,但第一个函数没有。
除了本地与全局之外,还有更多内容。创建的全局变量与var
没有创建的全局变量不同。考虑一下:
var foo = 1; // declared properly
bar = 2; // implied global
window.baz = 3; // global via window object
根据目前的答案,这些全局变量foo
、bar
、 和baz
都是等价的。这是不是这种情况。用 制作的全局变量var
(正确)分配了内部[[DontDelete]]
属性,因此它们不能被删除。
delete foo; // false
delete bar; // true
delete baz; // true
foo; // 1
bar; // ReferenceError
baz; // ReferenceError
这就是为什么您应该始终使用var
,即使对于全局变量也是如此。
围绕这个主题有很多混乱,现有的答案都没有清楚直接地涵盖所有内容。以下是一些带有内联注释的示例。
//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
}
为了非常清楚地描述正在发生的事情,对删除函数的分析广泛地涵盖了变量实例化和赋值。