2016-10-11 11 views
1

私はnode.js v6.7.0で作業していますが、 'this'への参照を持つオブジェクトを宣言している間は、矢印関数内にある場合は未定義を返しますが、通常の匿名関数の内部にある場合はオブジェクト自体を返します私が欲しい)矢印関数で参照されているときに 'this'が 'undefined'を返しますが、匿名関数で呼び出されたときには 'not'が返されるのはなぜですか?

例えば

let obj = { 
 
    key: 'val', 
 
    getScopeWithArrow:() => {return this;}, //returns undefined 
 
    getScopeWithAnonymous: function() {return this;} //returns the object properly 
 
}

+0

ます。https://developer.mozilla。org/ja-ja/docs/Web/JavaScript /リファレンス/関数/ Arrow_functions#No_binding_of_this –

+0

@ T.J.Crowder何か矢印関数について特別なので、私はそれを投影しました。 –

+0

Google検索:[site:stackoverflow.com javascript this undefined in arrow機能](https://www.google.com/search?q=site%3Astackoverflow.com+javascript+this+undefined+in+arrow+function) –

答えて

5

矢印機能は、独自のthis、彼ら近い上を持っていないので呼び出しコンテキストの。しかし、矢印以外の関数がバインドされていない場合は、と呼ばれる方法でに基づいてthisを取得します。

obj.getScopeWithArrow(); 
obj.getScopeWithAnonymous(); 

最初のケースでは、再び、矢印機能は取得していない独自のあなたがそれを呼び出しているかthisので、それは問題ではない:私はあなたがこのようにこれらの関数を呼び出していると仮定します。 2番目のケースでは、となりますので、thisは同じオブジェクトを参照します。objを参照してください。


別に:thisのみundefinedがstrictモードにすることができるので、あなたの例では、あなたは、strictモードでなければなりません。

別に2:あなたのメソッド名に関して:thisと「スコープ」はお互いに非常に少ししかありません。


いくつかの例:

function showThis(label, t) { 
 
    if (t === window) { 
 
    console.log(label, "(global object)"); 
 
    } else { 
 
    console.log(label, t); 
 
    } 
 
} 
 
// Loose mode by default in a non-module script element 
 
let obj = { 
 
    arrow:() => { 
 
    showThis("arrow says ", this); 
 
    }, 
 
    normal: function() { 
 
    showThis("normal says ", this); 
 
    } 
 
}; 
 
obj.arrow(); // global object (window on browsers) 
 
obj.normal(); // obj 
 

 
function foo() { 
 
    // Here, we're in strict mode 
 
    "use strict"; 
 
    let obj = { 
 
    arrow:() => { 
 
     showThis("arrow says ", this); 
 
    }, 
 
    normal: function() { 
 
     showThis("normal says ", this); 
 
    } 
 
    }; 
 
    obj.arrow(); // undefined 
 
    obj.normal(); // obj 
 

 
} 
 
foo();
developer.mozilla.orgによれば

+0

このような素敵な答え、ありがとうTJそれを説明する時間を取るために! –

0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

この

の無結合

新しい関数はすべて独自の値を定義しています(コンストラクタの場合は新しいオブジェクト、厳密なモード関数呼び出しでは未定義、関数が "オブジェクトメソッド"として呼び出された場合はコンテキストオブジェクトなど) 。これは、オブジェクト指向のプログラミングスタイルに迷惑をかけることが判明しました。

しかし

目標は、関数を書く避けるためである場合は、コロンを使用しないよう、新たなECMA6オブジェクト関数宣言の構文を使用してメソッドを宣言することができます。

let obj = { 
 
    key: 'val', 
 
    getScopeWithParens() {return this;}, //returns object 
 
    getScopeWithAnonymous: function() {return this;} //returns the object properly 
 
} 
 

 
console.log(obj.getScopeWithAnonymous()); 
 
console.log(obj.getScopeWithParens());

+0

ああ、私はES6でその新しい構文について知らなかった、ところでありがとう、おそらく私はそれを試してみてください –

関連する問題