JavaScript ではなぜ特定の関数呼び出しが「不正な呼び出し」と呼ばれるのでしょうか? 質問する

JavaScript ではなぜ特定の関数呼び出しが「不正な呼び出し」と呼ばれるのでしょうか? 質問する

たとえば、次のようにします。

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);
}

おすすめ記事