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で参照されます.