【发布时间】:2014-11-17 06:31:56
【问题描述】:
我遇到了一个有趣的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. 语言定义:默认情况下,所有范围都给定名称 this 和 arguments。 2. 形参:函数可以具有命名形参,其作用域为该函数的主体。 3. 函数声明:这些是函数 foo() {} 的形式。 4. 变量声明:形式为 var foo;
他后来引用了:
要记住的最重要的特殊情况是名称解析顺序。请记住,名称有四种方式进入给定范围。我在上面列出它们的顺序是它们被解析的顺序。通常,如果一个名称已经定义,它永远不会被另一个同名的属性覆盖。这意味着函数声明优先于变量声明。这并不意味着对该名称的赋值不起作用,只是声明部分将被忽略。
这让我很困惑,任何人都可以参考上面的例子来简化这个? 我想知道的要点:
- 函数内没有
var的变量如何提升? - 在提升过程中是否发生变量覆盖?
【问题讨论】:
-
scribu.net/blog/javascript-var-keyword-for-php-developers.html - "在函数内部,所有未声明的变量都是全局变量。只有用 var 声明的变量是局部变量。"
标签: javascript scope hoisting