2017-02-23 11 views
0

以下の例はうまく機能し、内部スコープでレキシカルスコープが使用できます。ES6の語彙スコープの問題

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:)(

"use strict"; 

VARは、fn =関数fn:プロパティを設定することはできません 'NO' 未定義

+2

「スコープ」は、外部関数のみを任意の変数として宣言しているため、ここでの問題とは関係ありません。問題は、矢印関数と正規関数の間に 'this'がどのように結びついているかにあります。 – Pointy

+0

名前付き関数を伝統的な方法で与えると、以下のコードが動作することを理解します。しかし、なぜそれを得ることができませんでした。 – alowsarwar

+3

arrow関数にはコンストラクタがありません。新しいキーワードを使用してそれらをインスタンス化することはできません。 – ndugger

答えて

0

ES5のをこのように機能を追加翻訳{

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); 
}; 

}。

デフォルトスコープがないため、これは未定義です。es6コンパイラは、これをトップスコープにバインドする関数で使用します。