js関数におけるthisキーワードの変数のスコープに対する影響
11669 ワード
function
test
( ) {
alert ( arg) ;
var arg = 1;
}
test
・( ) ;
このコードは時報で間違っています.「undefined」function test ( ) {
alert ( arg) ;
this . arg = 1;
}
test ( ) ;
このコードは時報をコンパイルしています.arg is not defined」
var arg = 2;
function test ( ) {
alert ( arg) ;
var arg = 1;
}
test ( ) ;
このコードはまだ時報で間違って運行されています.「undefined」var arg = 2;
function test ( ) {
alert ( arg) ;
this . arg = 1;
}
alert ( arg) ;
test ( ) ;
alert ( arg) ;
このコードは正常に動作しています.3回の表示はそれぞれ2、2、1です.関数内のthis.argはグローバル変数の値を変えています.つまり、現在のthisはwindowオブジェクトを指しています.上のコードは下のコードと同じです.var arg = 2;
function test ( ) {
alert ( arg) ;
this . arg = 1;
}
alert ( arg) ;
window . test ( ) ;
alert ( arg) ;
オブジェクトの例を変えてみます.var arg = 2;
function test ( ) {
alert ( arg) ;
this . arg = 1;
}
alert ( arg) ;
var t = new test ( ) ;
alert ( t. arg) ;
alert ( arg) ;
現在、前後の大域変数argの値は変化していません.現在のthisはtがwindowではないということを示しています.私たちはもう一度検証します.
function test ( ) {
this . arg = 1;
}
test ( ) ;
alert ( arg) ;
この時1弾いて、okを検証します!表示関数と変数のデフォルトの属主はwindowオブジェクトです.私たちはもう一つの例を実験します.
function test ( ) {
var arg = 1;
alert ( arg) ;
}
test ( ) ;
alert ( arg) ;
このコードはまず1を弾いてから、コンパイルのエラーを報告します.arg is not defined」では、関数内のargは局所変数だけでwindowオブジェクトに影響しません.window.argはまだ定義されていません.
私たちは想像力を発揮して、さらに広げます.
function test ( ) {
this . msg = function ( i) { alert ( i) ; }
}
test ( ) ;
msg( 'ok' ) ;
上のコードが思いどおりに「ok」をはじきました.msgもポインティング関数のポインター変数にすぎないので、無名関数を指しています.testを実行すると、この関数は即時に作成され、同じwindowの属性に属します.ポインティング関数変数の非thisの例を実験しました.
function test ( ) {
var msg = function ( i) { alert ( i) ; }
msg( 1) ;
}
test ( ) ;
msg( 2) ;
上のコードは先に「1」を弾いてコンパイルエラーを報告します.msg(2):msg is not defined」.可視関数内にthis修飾されていないmsgは、関数内の局所的に利用可能な関数ポインタであり、外部からは起動できません.
まとめ:関数内の変数(ポインティング関数を含むポインティング変数)に対して、thisキーワードは常に関数を呼び出すオブジェクトを指します.関数を単独で呼び出すと、オブジェクトはwindowで参照されます.var t=new test()で呼び出すと、そのオブジェクトはtで参照されます.