function Foo(){
bar=function(){console.log(1)};
return this;
}
Foo.bar=function(){console.log(2)}
Foo.prototype.bar=function(){console.log(3)};
var bar = function(){console.log(4)}
function bar(){
console.log(5);
}
new bar();
Foo.bar();
Foo().bar();
bar();
new Foo().bar()
//4 2 1 1 3
这样浏览器编译后又有函数提升和变量提升了,最后会变成什么结果,为什么new bar会打印4,console.log(5)是不是被永久覆盖了?
一点一点讲:
第一步,js解释器对js代码进行解析编译,这个时候会进行你知道的函数声明提升步骤。
这是源代码:
声明提升转化后代码:
看到了吧,bar函数被进行了覆盖,相当于以下代码:
第二步,接着往下执行
第三步,接着往下
第四步
第五步,再往下