120

たとえば、これを行うと:

var q = document.querySelectorAll;

q('body');

Chrome で「不正な呼び出し」エラーが発生します。これが必要な理由は思いつきません。1 つには、すべてのネイティブ コード関数に当てはまるわけではありません。実際、私はこれを行うことができます:

var o = Object; // which is a native code function

var x = new o();

そして、すべてがうまく機能します。特に、ドキュメントとコンソールを扱うときにこの問題を発見しました。何かご意見は?

4

3 に答える 3

194

これは、関数の「コンテキスト」を失ったためです。

電話をかけるとき:

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);
}
于 2012-05-24T18:53:29.630 に答える
-1

私の場合、宣言されていない変数を関数に引数として渡したために、不正な呼び出しが発生しました。関数に渡す前に、必ず変数を宣言してください。

于 2017-08-07T12:12:49.560 に答える