var _ = function() {console.log('a')};
var q = (function() {
return {
0: function _() {
console.log('c');
},
'dx': function dasdsa() {
_();
}
};
})();
q.dx();
有上述一段代码,在chrome下执行是a,在IE8下执行是c,为什么呢?
感觉有点奇怪,应该输出是c吧
看到这个问题我也是懵的,所以研究了一下,还挺有意思。以下是我的理解:
原因应该是ES6的块级作用域的问题。
为了不混淆:var _的值虽然是一个函数,但是我们称呼为变量_,q内定义的_称呼为函数_
ES6块内声明的函数其作用域在这个块内,q里这个立即执行函数已经创建了一个函数作用域,里面使用function xxx() {} 格式声明并定义的函数会提升到这个作用域,相当于在这个作用域开头声明的函数一样,IE8中函数_就被提升到这里了。q.dx其实形成了一个闭包,IE8中作用域内能找到函数_,所以hold的_是函数_,输出c;对于支持ES6块级作用域的chrome, return语句对象内声明的函数不能提升到块外面去,所以q.dx包住的_是变量_,所以输出a.