たとえば、次のようにします。
var q = document.querySelectorAll;
q('body');
Chrome で「不正な呼び出し」エラーが発生します。なぜこれが必要なのか、理由が思いつきません。まず、すべてのネイティブ コード関数でこれが当てはまるわけではありません。実際、次のようにすることができます。
var o = Object; // which is a native code function
var x = new o();
そして、すべて正常に動作します。特に、ドキュメントとコンソールを扱うときにこの問題を発見しました。何かご意見はありますか?
ベストアンサー1
それは関数の「コンテキスト」を失ってしまったからです。
電話をすると:
document.querySelectorAll()
関数のコンテキストは であり、そのメソッドの実装によってdocument
としてアクセス可能になります。this
単に呼び出すと、q
コンテキストはなくなり、window
代わりに「グローバル」オブジェクトになります。
の実装はquerySelectorAll
を使用しようとしますthis
が、これはもはや DOM 要素ではなく、オブジェクトですWindow
。実装は、オブジェクトに存在しない DOM 要素のメソッドを呼び出そうとしWindow
、インタープリターは当然ながら不正を呼び出します。
これを解決するには、.bind
新しいバージョンの Javascript を使用します。
var q = document.querySelectorAll.bind(document);
これにより、 の後続のすべての呼び出しがq
適切なコンテキストを持つことが保証されます。 がない場合は.bind
、これを使用します。
function q() {
return document.querySelectorAll.apply(document, arguments);
}