我遇到了一个有趣的测验
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";
}
这是我正在阅读的参考资料
在 JavaScript 中,名称以四种基本方式之一进入范围: 1. 语言定义:默认情况下,所有范围都被赋予名称 this 和参数。2. 形参:函数可以具有命名形参,其作用域为该函数的主体。3. 函数声明:这些是函数 foo() {} 的形式。4. 变量声明:采用 var foo 的形式;
他后来引用:
要记住的最重要的特殊情况是名称解析顺序。请记住,名称有四种方式进入给定范围。我在上面列出它们的顺序是它们被解析的顺序。通常,如果一个名称已经定义,它永远不会被另一个同名的属性覆盖。这意味着函数声明优先于变量声明。这并不意味着对该名称的赋值不起作用,只是声明部分将被忽略。
这让我感到困惑,任何人都可以参考上面的例子来简化这个吗?我想知道的要点:
- 没有
var
函数内部的变量如何提升? - 提升期间是否发生变量覆盖?