obj.method()
をJavascriptで呼び出すと、obj
としてthis
が渡されます。したがって、document.getElementById('x')
を呼び出すと、this
〜document
と設定されます。あなただけのf = document.getElementById
を書く場合
は、しかし、あなたは今、関数への新しい参照を持っていませんが、その参照はもはやdocument
に「バウンド」です。
f
を裸の関数名として呼び出すと、グローバルオブジェクト(window
)にバインドされるため、コードが機能しません。関数の内部がthis
を使用しようとするとすぐに、document
の代わりにwindow
があり、驚くことではありません。あなたはそれを呼び出す場合
あなたははf
作業を行うことができます。
var x = f.call(document, 'x');
f
を呼び出しますが、明示的にdocument
にコンテキストを設定します。
この問題を解決するための他の方法は、ES5でのみ利用可能であるFunction.bind()
を使用することです:
var f = document.getElementById.bind(document);
と本当に正しくコンテキストを設定し、独自のラッパーを作成するためだけの一般的なショートカットです:
function f(id) {
return document.getElementById(id);
}
ドキュメント 'でこの答え、' this'を明確にする:
バベルはこれができます.getElementById()は 'document'ですが、スコープを実行している' this'はグローバルスコープです。別名 'this'は' window'オブジェクトです。 –