变量:本地作用域、全局作用域还是 JavaScript 引擎
Variable: local scope, global scope or is it the JavaScript engine?
这是我在javascript中学习scope时发现的有趣的东西。
法典
var foo = "This is a global variable.";
var bar = function() {
alert(foo);
foo = "Value has been modified";
}
bar();
alert(foo);
这给出了您认为会得到的正常响应,但是如果我更改这一行:
从:
foo = "Value has been modified";
自:
var foo = "Value has been modified";
我得到一个未定义的 foo 值,这是为什么?由于该函数是全局范围的,为什么它不接受它前面的 var 关键字?
编辑
现在我基本上了解了正在发生的事情,函数栏中的var foo
将因为 var 关键字而变得最重要并被提升,但它将在没有分配值的情况下被提升。
在 var
语句中,它有两个部分 - 实际声明:
var foo //;
。和分配,这是可选的:
= 1234567890;
如果没有对它进行赋值,则变量(如果尚未定义)默认为 undefined
。
变量声明部分将移动到当前范围的顶部(函数的开头),但不会移动到实际赋值的顶部(因此它等效于以下内容):
var foo = "This is a global variable.";
var bar = function() {
var foo; // undefined
alert(foo); // yes, it's undefined
foo = "Value has been modified"; // modify local, not global
}
bar();
alert(foo); // the global one
函数创建自己的作用域 - 例如:
var test = function ()
{ var bar = 1;
console.log(bar); // 1
};
test();
console.log(bar); // ReferenceError: bar is not defined
通过使用 var
,您告诉引擎使用名为 foo 的局部变量,隐藏全局变量。
你在alert
上未定义的原因是使用var
会影响整个范围,而不仅仅是从那一点开始。你可以写:
var foo;
alert(foo);
foo = "Value has been modified";
JavaScript 引擎将解析您的代码并将var
声明移动到其范围的顶部,但分配给它的字符串将保留在原处。解析后,以下是代码的解释方式:
var foo = "This is a global variable.";
var bar = function() {
var foo;
alert(foo);
foo = "Value has been modified";
}
bar();
alert(foo);
当它在函数顶部创建一个没有任何值的局部变量时,警报将显示undefined
。
相关文章:
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- Javascript作用域和Ajax调用;工作不正常
- 带有KendoUI组件的Javascript变量作用域
- TypeScript(JavaScript)中的项作用域
- 作用域问题-此函数是否形成闭包-JavaScript
- switch语句中的Javascript作用域
- JavaScript作用域:如何创建具有不同值的匿名函数
- 访问Javascript对象-Node.js的作用域问题
- Javascript中的内部函数作用域
- 什么's JavaScript数组中项目的作用域
- Javascript变量作用域:从回调函数中提取变量
- 为什么全局变量没有't似乎受到内部作用域(Javascript)的影响
- 对象变量作用域javascript
- Javascript函数作用域[Javascript Essentials]
- 私有作用域Javascript的最好方法
- 可变作用域Javascript模块模式
- 方法中的变量作用域(Javascript)
- 如何将作用域JavaScript作用域分离为多个文件(UbuntuJS作用域)
- 限制共享变量的作用域(Javascript)
- 将函数的参数提取到全局作用域(javaScript)