javascript上下文中var的顺序是否重要
Does the order of var in the javascript context matter?
也许这很愚蠢,但我真的对"var"关键字感到沮丧。我很难弄清楚以下问题:
var local = true;
function outer() {
/* local scope */
var local = false;
function inner() {
alert(local);
var local;
}
inner();
}
outer();
function a(x) {
return x * 2;
}
var a;
alert(a);
如有任何解释,不胜感激。
注释源;我假设这个代码是从全局范围开始的:
var local = true; // Creates a global variable called `local`
function outer() {
/* local scope */
var local = false; // Creates a local `local` within `outer`, shadowing (hiding) the global
function inner() {
alert(local); // alerts "undefined", the value of `inner`'s `local`
var local; // Creates a local `local` within `inner`, shadowing (hiding) `outer`'s version
}
inner();
}
outer();
function a(x) { // Creates a global function `a`
return x * 2;
}
var a; // Has no effect
alert(a); // alerts the function source (on engines that have it)
在上面的代码中,基本上有三件事在起作用:
嵌套作用域中的声明会隐藏(隐藏)包含范围中的声明。因此,
outer
中的local
遮蔽全局,而inner
中的local
遮蔽outer
的local
。var
声明是在执行进入执行上下文时处理的,而不是它们出现在源代码中的位置。它们有时被称为"被吊起",因为它们被有效地向上移动(升起、吊起)到了发生它们的环境的顶部。(更多:错误理解的var
)这种影响在inner
函数中特别明显,因为被警告的local
是来自inner
的,而不是来自outer
的(这就是为什么它是undefined
),即使声明在警告下面。函数声明在定义它们的作用域中创建一个符号,与
var
声明位于相同的符号空间中。(具体而言,它们都在它们所在的执行上下文的词法环境中创建条目。)。)因此,如果您有一个函数声明和一个具有相同名称的var
(就像您在代码末尾使用a
一样),就会发生冲突。哪一个获胜?函数声明获胜,因为规范的§10.5规定了顺序,其中规定函数声明发生在var
声明之前,并且已经定义的符号的var
不会覆盖它。
相关文章:
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- 在学习JavaScript,Ajax,jQuery和JSON时是否与顺序相关
- 是否可以通过 AJAX *按顺序*上传文件
- 是否可以按顺序基于关联进行查询
- Node.JS中的模式顺序是否重要
- 是否可以在JqGrid中按字母顺序以外的其他方式对组进行排序
- 确定字符串中的所有字母是否按JavaScript字母顺序排列
- javascript 是否保证枚举同一对象两次将以相同的顺序遍历字段
- 除了JS,其他语言是否按加载顺序执行代码
- 是否可以按当前排序顺序获取跨多个页面的所有 jqGrid 行
- 如何检查数组是否包含不同顺序的字符串
- 对象属性的分配顺序是否与声明顺序相同
- Javascript中操作的执行顺序是否保证始终相同
- PHP 必需或包含的文件是否需要遵循顺序
- 如何测试字符串是否按顺序包含多个定义的单词
- JavaScript 是否对函数参数有明确的计算顺序?
- 是否仍然可以指定单层上特征的z顺序
- 承诺的解决顺序是否与Promise.sexel中提到的顺序相同
- javascript上下文中var的顺序是否重要
- 在JavaScript中计算相等或同一性时,操作数顺序是否有任何区别