H5W3
当前位置:H5W3 > 其他技术问题 > 正文

【Web前端问题】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吧

回答:

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

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

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

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

本文地址:H5W3 » 【Web前端问题】JS代码执行作用域的问题

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址