如何解释IE下不可达if语句中函数声明变量提升对history造成的影响?

如何解释IE下不可达if语句中函数声明变量提升对history造成的影响?

为什么无论如何都只有history被覆盖?history有什么特殊之处吗?

ES6之前 block 中的函数声明是「未定义行为」。

代码

if (false) {
  function f() {}
}

在IE中相当于

if (false) {
  var f = function f() {}
}

其中var f被提升。

f的结果取决于是否已经有f绑定。如果已经有,则无效果;如果没有,则产生了f,其值为undefined

题主的测试中,console就是前者的情形,history则是后者的情形。

那么为什么会有这差别?

因为consolewindow上的属性, 相当于全局变量。而history则不是,它是Window.prototype上的getter

注意,较新的HTML规范和WebIDL规范规定,全局对象的属性直接存在于对象上而不是其原型上,所以现代浏览器没有这个问题。

作者:贺师俊 链接:https://www.zhihu.com/question/411145239/answer/1377346941 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后更新于

这有帮助吗?