<div id="app"> <button onClick="app()">点击1</button> <button onClick="app1()">点击2</button> </div> <script> function app () { console.log(this); } function app1 () { app();
}
app();
</script>
非严格模式下,打印window; [object Window],
严格模式下,打印undefined
app1(); function app1(){ } app1(); function app1(){ var i =3; console.log(i); } function app1(){ var i =2; console.log(i); }
输出如下:
2
2
解释:后面的函数会覆盖前面的,所以执行最后一个函数。
console.log(a); //undefined var a = 3; console.log(a); //function a() function a(){};
由此可知为什么输出的是函数a。拓展一下:
var a; function a(){}; console.log(a); //function a() var a = 3; function a(){}; console.log(a); //3
同一个标识符的情况下,变量声明与函数声明都会提升;函数声明会覆盖变量声明,但不会覆盖变量赋值,即:如果声明变量的同时初始化或赋值那么变量优先级高于函数。
a=10; console.log(a); var a = 3; function a(){}
1)函数声明会置顶
2)变量声明也会置顶
3)函数声明比变量声明更置顶:)
4)变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置
5)声明过的变量不会重复声明
按以上的规则
题主的代码等价为
function a(){} var a;//实际无效 console.log(a); a = 3;