次のコードが機能しないのはなぜですか?
var f = document.getElementsByTagName;
var x = f('div');
Chrome では「TypeError: Illegal invocation」、Safari では「TypeError: Type error」が発生します。Firefox ではエラーは発生しませんが、機能しません。IE や Opera でのテストはまだ行っていません。
次のコードが機能しないのはなぜですか?
var f = document.getElementsByTagName;
var x = f('div');
Chrome では「TypeError: Illegal invocation」、Safari では「TypeError: Type error」が発生します。Firefox ではエラーは発生しませんが、機能しません。IE や Opera でのテストはまだ行っていません。
Javascript には「バインドされたメソッド」のようなものはありません (この用語は Python から借用したものです。既にご存知だと思いますが、説明が長くなる可能性があります)。「document.getElementsByTagName」への参照を取得すると、ドキュメント オブジェクトに関連付けられたメソッドではなく、関数への参照を取得するだけです。呼び出すと、「this」はドキュメントではなくウィンドウに設定されるため、機能しません。
技術的には、これを行うことで必要なものが得られますが、おそらく無意味であることがわかります。
var x = f.call(document, 'div')
(これは読みにくく、document.getElementsByTagName() を呼び出すほど高速ではないため、無意味です。クロージャの使用も同様に無意味です。)
javascript では、メソッドthis
は呼び出されたオブジェクトから取得され、別の変数に格納されたメソッドを呼び出すと、それthis
がグローバル コンテキスト (またはwindow
、ブラウザーでは ) になります。これはうまくいくはずです:
var f function ()
{
return document.getElementsByTagName.apply(
document
, arguments
);
}
var x = f('div');
その理由は、オブジェクトで getElementsByTagName を呼び出す必要があるためです。関数定義内で、this
どの要素でタグを検索するかを判断するために使用すると言えます。関数をコピーして呼び出すと、新しいスコープが与えられます。つまりthis
、別のオブジェクトを指していないことを意味します。 . ドキュメントで関数を呼び出すには、これを試してください:
var f = document.getElementsByTagName;
var x = f.call(document, "pre");
alert(x[0]);
これを試して:
function f(divName){
return document.getElementById(divName);
}
var x = f('div');
括弧を使用して、関数を呼び出そうとしています。問題は、コード内の「f」が関数ではなく変数であることです。