ES6词汇范围问题

时间:2017-02-23 13:42:00

标签: javascript ecmascript-6

以下示例工作正常,内部范围内提供词法范围。

var fn =function(){

  this.no = 0;

  this.addNo = () => {

      setTimeout( ()=> {
        // ES6 lexical scope is available 
        this.no =++this.no;
        console.log(this.no);
      }, 2000);

  }

}

var f1 = new fn();
f1.addNo();
f1.addNo();

以下示例不起作用。

var fn =() =>{

  this.no = 0;

  this.addNo = () => {

      setTimeout( ()=> {
        // ES6 lexical scope is not available 
        this.no =++this.no;
        console.log(this.no);
      }, 2000);

  }

}

var f1 = new fn();
f1.addNo();
f1.addNo();

错误

" TypeError:无法设置属性' no'未定义的

1 个答案:

答案 0 :(得分:0)

es5翻译添加这样的功能:

"use strict";

var fn = function fn(){

undefined.no = 0;

undefined.addNo = function () {

    setTimeout(function () {
        // ES6 lexical scope is not available
        undefined.no = ++undefined.no;
        console.log(undefined.no);
    }, 2000);
};

}; 和es6翻译代码,这样你就可以看到不同的代码。

var _this = this;

var fn =()=> {

_this.no = 0;

_this.addNo = () => {

    setTimeout(() => {
        // ES6 lexical scope is not available
        _this.no = ++_this.no;
        console.log(_this.no);
    }, 2000);
};

};

因为函数没有默认作用域,所以在es5中这是未定义的。在es6编译器中使用它在函数绑定到顶部作用域。