2016-04-10 7 views
0

私はES2015でBabelを使用しています。そしての中にthisを使いたいです。ES6の "コールバック"で "this"クラスの使い方は?

class baz { 
    bar = "xxx"; 
    foo() { 
    x(function() { 
     console.log(this.bar); 
    }); 
    } 
} 

function x(callback) { 
    return callback(); 
} 
var y = new baz(); 
y.foo(); 

https://jsfiddle.net/dnthehnt/7/ 限り私は理解して、これはx()でコールバック関数を参照するので、私は

TypeError: this is undefined

を取得しています。解決策として、私は

class baz { 
    bar = "xxx"; 
    foo() { 
    var bar = this.bar;//<===== 
    x(function() { 
     console.log(bar);//<===== 
    }); 
    } 
} 

function x(callback) { 
    return callback(); 
} 
var y = new baz(); 
y.foo(); 

https://jsfiddle.net/dnthehnt/6/ を使用し、

xxx

を得るこれが解決策ですが、コードの質量を持っている場合、それを書くのは非常に混乱し、ハードになっています。 thisを使用するためのより良い解決法はありますか?またはコールバックとこれを使用するためのES6のための他の規律。

+1

有効なES2015ではありません。 2行目( 'bar =" xxx ";')では無効です。 A) 'constructor(){/*...*/} 'にコードを入れ、B)' bar'の前に 'this.'を使用する必要があります。 –

+0

'' 'constructor'''を入れる必要はないと思います。私は、初期化時に追加されるコンストラクタ変数を入れる方が良いと思います。 – Shekspir

+2

これは、「思考」の問題ではありません。そのコードは有効なES2015コードではありません。インスタンスフィールドをそのように定義できるようにするための[ステージ1の提案](https://github.com/jeffmo/es-class-fields-and-static-properties)がありますが、ステージ1だけです(ステージがあります0〜4、4は「次の仕様に含める準備ができています」)。 ES2016の仕様をカットオフしたわけではなく、スピードが速くなければ、ES2017を探していました。したがって、Babelはそれを変えるかもしれませんが(Babelには多くの非標準機能があります)、構文が仕様に入る前に変更され、非標準コードが残されます。 –

答えて

7

矢印機能を参照してください。特に、thisは、古典的機能と比較して矢印機能によって処理されます。古典的な機能を使用して

class baz { 
    constructor() { this.bar = "xxx"; } 
    foo() { 
    x(() => { 
     console.log(this.bar); 
    }); 
    } 
} 

あなたのソリューションバーがxへの呼び出しとコールバックの呼び出しの間で変更された場合は動作しません。

これは、あなたは、古典的な機能

class baz { 
    constructor() { this.bar = "xxx"; } 
    foo() { 
    const self = this; 
    x(function() { 
     console.log(self.bar); 
    }); 
    } 
} 

それともbindを使用することができますでそれを行うべきかですが、私は考えます。

class baz { 
    constructor() { this.bar = "xxx"; } 
    foo() { 
    x((function() { 
     console.log(this.bar); 
    }).bind(this)); 
    } 
} 
+0

ああ、ありがとう、ありがとう。私は()=> {}にプロトタイプがないことを忘れていました。 – Shekspir

+3

@Shekspir:プロトタイプとは何も関係ありません。矢印関数には 'this'バインディングがないので、作成されたコンテキストから継承します。 –

+0

ああ、情報ありがとう。 – Shekspir

関連する問題