オブジェクトリテラルのアロー関数がwindow
をthis
として呼び出している理由を理解しようとしています。誰かが私にいくつかの洞察を与えることはできますか?
_var arrowObject = {
name: 'arrowObject',
printName: () => {
console.log(this);
}
};
// Prints: Window {external: Object, chrome: Object ...}
arrowObject.printName();
_
そして、期待どおりに機能するオブジェクト:
_var functionObject = {
name: 'functionObject',
printName: function() {
console.log(this);
}
};
// Prints: Object {name: "functionObject"}
functionObject.printName();
_
Babel REPL によると、彼らは
_var arrowObject = {
name: 'arrowObject',
printName: function printName() {
console.log(undefined);
}
};
_
そして
_var functionObject = {
name: 'functionObject',
printName: function printName() {
console.log(this);
}
};
_
arrowObject
をthis
としてarrowObject.printName();
を呼び出さないのはなぜですか?
コンソールログは Fiddle からのものです(_use strict;
_は使用されません)。
Babel変換はストリクトモードを想定していますが、window
を使用した結果は、コードをルーズモードで実行していることを示しています。ルベルモードを想定するようにBabelに指示すると、そのトランスパイレーション (異なる :
_var _this = this; // **
var arrowObject = {
name: 'arrowObject',
printName: function printName() {
console.log(_this); // **
}
};
_
厳密モードトランスパイレーションのconsole.log(_this);
ではなく、__this
_グローバルとconsole.log(undefined);
に注意してください。
オブジェクトリテラルのアロー関数が
window
をthis
として呼び出している理由を理解しようとしています。
アロー関数は、作成されたコンテキストからthis
を継承するためです。どうやら、これをやっているところ:
_var arrowObject = {
name: 'arrowObject',
printName: () => {
console.log(this);
}
};
_
...this
はwindow
です。 (厳密モードを使用していないことを示唆しています。明確な理由がない場合に使用することをお勧めします。)厳密モードグローバルコードのundefined
など、それ以外の場合は、this
は、代わりに他の値になります。
イニシャライザを論理的に等価に分解すると、アロー関数が作成されるコンテキストが少し明確になる場合があります。
_var arrowObject = {};
arrowObject.name = 'arrowObject';
arrowObject.printName = () => {
console.log(this);
};
_