2

重複の可能性:
JavaScript のこの演算子

コンテキストという用語は私を少し混乱させます。関数内で関数、つまりネストされた関数を宣言し、そこで実行すると、以下のようになります...

function  foo(){
    function fo(){
    alert(this);
       }
    fo();
   }

関数 fo() はその親関数内にあるため、 this キーワードは window ではなく関数オブジェクトを指す必要があります。また、このキーワードは関数が動作する現在のオブジェクトを指しているため、関数オブジェクトはネストされた関数が動作するオブジェクトです。

4

4 に答える 4

2

foo()トップレベルで呼び出すだけなら、 と同じですwindow.foo()
Andはfoowindowの実体なので、オブジェクトを指します。contextthiswindow

于 2013-01-06T04:42:39.140 に答える
1

thisコンストラクターではない関数内でランダムに使用すると、いくつかの異なる結果のいずれかが得られます。

function callThis () { return this; }


callThis(); // returns window object

var Bob = { func : callThis };

Bob.func(); // returns Bob

callThis.call(Bob);  // returns Bob

Call は、呼び出しのコンテキストを決定するために使用されるメソッドです。
呼び出しのコンテキストを次の方法で判別できない場合:

を。「。」の前にあるもの ( Bob.func();)
b. .call().apply()またはに明示的に渡されるもの.bind()

次に、に設定されていwindowます。

それがコンテキストの解決方法です。

したがって、特定のオブジェクトを念頭に置いている場合this、解決策は次のとおりです。

function objMethod () {
    var self = this;
    function doStuff () {
        self.otherFunc();
        self.otherProperty = "bob";
    }

    doStuff();
}


var myObj = { myMethod : objMethod };
myObj.myMethod();

myObjobjMethodコンテキストを に設定して呼び出しますmyObj。現在のコンテキスト ( )
objMethodへの参照を として保存します。参照を使用して、参照されたオブジェクトのプロパティを変更します。myObjselfdoStuff

function outer () {
    function inner () { this.property = "Bob"; }
    inner.call(this);
}


var obj = {};
outer.call(obj);

ここでouterは、 を使用してコンテキストが渡されます.call()
次に、再びofを使用innerして渡されますthisouter.call()

var bob = { name : "Bob" };

function sayName () { console.log(this.name); }

var bobFunc = sayName.bind(bob);
bobFunc();

ここでは、が常に に設定されて.bind()いるバージョンの sayName を作成するために使用します。 これらのシステムを好きなだけ自由に組み合わせて使用​​できます (非同期プログラミングを扱う場合は、おそらくそうするでしょう)。thisbob

于 2013-01-06T05:07:30.527 に答える
1

dlutxxが言ったことに追加します。(グローバル空間に)foo()関数があり、コンテキストがウィンドウ自体であるように単純に呼び出す場合(関数はウィンドウオブジェクトのメンバーであるため)。ただし、new関数の新しいインスタンスを取得するためにキーワードを使用するthisと、関数オブジェクトが参照されます。

function foo() {
    alert(this);
}

foo(); // "this" inside the function will be window

new foo(); // "this" inside the function will be the function object.

this関数内にカスタム値が必要な場合は、次の.call()ように呼び出すことができます。

foo.call(x); // "this" inside the function will be x

あなたのケースのコード例:

function  foo(){
    function fo(){
        alert(this);
    }
    fo(); // "this" is window
    new fo(); // "this" is the function object
    fo.call('x'); // "this" is 'x'
}
于 2013-01-06T04:49:42.947 に答える
0

私の理解では、function fo()は のスコープで定義されていますが、つまり、返さない限りfunction foo()の外部からアクセスできないことを意味します。この内部関数を呼び出すときfooに の値に適用される規則は、this呼び出した場合と同じです。その他の機能。

function f() {
    function g() {
        console.log(this)
    }
    console.log(this);
    g();
    g.apply(this);
    }

f()           // => Window, Window, Window
f.apply(this) // => Window, Window, Window
f.apply({})   // => Object, Window, Object
于 2013-01-06T05:04:53.200 に答える