我遇到了一个有趣的quiz
function bar() {
return foo;
foo = 10;
function foo() {}
var foo = '11';
}
alert(typeof bar());
我的解释是这样的(根据控制台,这是错误的:)):
var foo; // global variable
function bar(){
function foo(){}
var foo; // Here variable foo should override foo function
return foo; // (according to me foo should be variable with undefined value) What is going on here, How JavaScript resolve naming order ?
foo = 10;
foo = "11";
}
这是我正在阅读的参考书this
在JavaScript中,名称通过以下四种基本方式之一进入范围:
1.Language-defined:默认情况下,所有作用域均使用名称this和arguments。
2.形式参数:函数可以具有命名形式参数,其范围仅限于该函数的主体。
3.函数声明:这些函数的形式为foo(){}。
4.变量声明:这些变量声明采用var foo;的形式。
他后来引用:
要记住的最重要的特殊情况是名称解析顺序。请记住,名称输入给定范围的方式有四种。我在上面列出的顺序是它们解决的顺序。通常,如果已经定义了名称,则永远不会被同名的另一个属性覆盖。这意味着函数声明优先于变量声明。这并不意味着对该名称的分配将不起作用,只是声明部分将被忽略。
这让我感到困惑,任何人都可以参考上面的示例来简化它吗?
我想知道的要点:
如何在函数内没有
var
的变量进行提升?提升过程中是否发生变量超控?
最佳答案
让我们暂时保留功能foo
。在函数内,如果在函数内的任何地方声明了变量,则声明将移至函数的顶部。所以实际上是这样评估的
function bar() {
var foo;
return foo;
foo = 10;
foo = '11';
}
但是,当您使用相同的名称声明函数时,它将具有优先权,并且其计算结果与此类似
function bar() {
var foo = function() {};
return foo;
foo = 10;
foo = '11';
}
这就是为什么您在警报框中得到
function
的原因。关于javascript - 提升名称解析顺序在JavaScript中如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25988531/