//update:好吧我已经搞清楚了,会在时间限制后自己回答……
《你不知道的Javascript》里面说是函数声明提升优先
代码1
foo(); //输出1
var foo = function(){
console.log(2)
}
function foo(){
console.log(1)
}
会被解释为这样?为什么undefined的变量foo不会导致foo()抛错?书上说是因为重复声明所以被忽略,有没有相关资料参考下?
function foo(){
console.log(1)
}
var foo;
foo(); //输出1
foo = function(){console.log(2)}
代码2
var foo = function(){
console.log(2)
}
function foo(){
console.log(1)
}
foo();//输出2
会被解释为这样?
function foo(){
console.log(1)
}
var foo;
foo = function(){console.log(2)}
foo();//输出2
自己回答
规则是:
对于同名的变量声明,Javascript采用的是忽略原则,后声明的会被忽略,变量声明和赋值操作可以写在一起,但是只有声明会被提升,提升后变量的值默认为undefined,结果是在赋值操作执行前变量的值必为undefined
对于同名的函数声明,Javascript采用的是覆盖原则,先声明的会被覆盖,因为函数在声明时会指定函数的内容,所以同一作用域下一系列同名函数声明的最终结果是调用时函数的内容和最后一次函数声明相同
对于同名的函数声明和变量声明,采用的是忽略原则,由于在提升时函数声明会提升到变量声明之前,变量声明一定会被忽略,所以结果是函数声明有效
同名函数声明
同名变量
会被解析为
同名变量和函数声明