如何解释IE下不可达if语句中函数声明变量提升对history造成的影响?为什么无论如何都只有history被覆盖?history有什么特殊之处吗?
如何解释IE下不可达if语句中函数声明变量提升对history造成的影响?
为什么无论如何都只有history被覆盖?history有什么特殊之处吗?
ES6之前 block 中的函数声明是「未定义行为」。
代码
if (false) { function f() {} }
在IE中相当于
if (false) { var f = function f() {} }
其中var f被提升。
var f
f的结果取决于是否已经有f绑定。如果已经有,则无效果;如果没有,则产生了f,其值为undefined。
f
undefined
题主的测试中,console就是前者的情形,history则是后者的情形。
console
history
那么为什么会有这差别?
因为console是window上的属性, 相当于全局变量。而history则不是,它是Window.prototype上的getter。
window
Window.prototype
getter
注意,较新的HTML规范和WebIDL规范规定,全局对象的属性直接存在于对象上而不是其原型上,所以现代浏览器没有这个问题。
作者:贺师俊 链接:https://www.zhihu.com/question/411145239/answer/1377346941 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
最后更新于5年前