JS代码执行作用域的问题

var _ = function() {console.log('a')};
var q = (function() {
    return { 
        0: function _() {
            console.log('c');
        },            
        'dx': function dasdsa() {
            _();
        }
    };
})();
q.dx();

有上述一段代码,在chrome下执行是a,在IE8下执行是c,为什么呢?
感觉有点奇怪,应该输出是c吧

阅读 1.3k
1 个回答

看到这个问题我也是懵的,所以研究了一下,还挺有意思。以下是我的理解:

原因应该是ES6的块级作用域的问题。

为了不混淆:var _的值虽然是一个函数,但是我们称呼为变量_,q内定义的_称呼为函数_

ES6块内声明的函数其作用域在这个块内,q里这个立即执行函数已经创建了一个函数作用域,里面使用function xxx() {} 格式声明并定义的函数会提升到这个作用域,相当于在这个作用域开头声明的函数一样,IE8中函数_就被提升到这里了。q.dx其实形成了一个闭包,IE8中作用域内能找到函数_,所以hold的_是函数_,输出c;对于支持ES6块级作用域的chrome, return语句对象内声明的函数不能提升到块外面去,所以q.dx包住的_是变量_,所以输出a.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏