0

ejohn.org から引用:

function katana(){ 
  this.isSharp = true; 
} 
katana(); 
assert( isSharp === true, "A global object now exists with that name and value." ); 

これは真実として出てきます。

誰でもこれを説明できますか?私たちが見る関数の中に、プロパティを持つべき がthis.isSharp = true作成され、その値は になるのではないでしょうか? (関数を呼び出すので、オブジェクトはカタナだと思います)。言い換えれば、正確には何を指しているのでしょうか?objectisSharptruekatana.isSharptruethis

isSharpなぜ物として作られるのか?

4

4 に答える 4

3

thisJavaScript では本当に不安定です。

this関数のプロパティとしてではなく、関数呼び出しを取り巻くコンテキストに基づいて決定されます。関数が次のように呼び出された場合:

f()

次にthis、グローバル オブジェクトを参照します。グローバル オブジェクトにプロパティを追加することは、ご覧のようにグローバル変数を追加することと同じです。関数が次のように呼び出された場合:

foo.f()

this参照しfooます。例:

> function printx() { console.log(this.x); }
> x = 300
> obj1 = {x: 20, printx: printx};
> obj2 = {x: 50, printx: printx};
> printx();
300
> obj1.printx();
20
> obj2.printx();
50

最後に、関数が次のように呼び出された場合:

new f()

次に、新しいオブジェクトが作成され、その新しいオブジェクトがthis参照され、式new f()はその新しいオブジェクト、またはオブジェクトを返すf()ifによって返されるオブジェクトのいずれかに評価されf()ます。

それはすべて仕様にあります。とても奇妙です。

于 2013-03-19T18:06:37.000 に答える
2

を使用しないnewので、関数内thisのグローバル オブジェクト ( window) も使用しません。

katana();

本当に

window.katana(); // the passed context is window

isSharp===trueこれが、実際にテストするアサーションが をwindow.isSharp返す理由trueです。

の新しいインスタンスを作成する場合はkatana、 を使用new katana()し、をそのままthisにして、関数内の新しいインスタンスにしますwindow.isSharp

于 2013-03-19T18:05:43.693 に答える
2

プロパティ isSharp を持つ必要があるオブジェクトを作成しませんか?その値は true になりますか?

いいえ、関数がコンストラクターとして呼び出されていないためです。があればvar obj = new katana()、プロパティを持つオブジェクトを取得できisSharpます。それ以外の場合は、単なる関数呼び出しなので、どうすればthisよいでしょうか? JavaScript は知らないので、それが未定義であると判断し、グローバル オブジェクトにフォールバックします (厳格モードでない限り)。

JavaScriptの内部関数の値の決定はthis、関数の呼び出し方法に応じて動的に決定されるため、混乱を招く可能性があります。基本的なルールは、this次の場合を除き、グローバル オブジェクトになります。

  • 関数がオブジェクト メソッドとして呼び出される (これがオブジェクトになります)、または
  • 関数は new 演算子を使用してコンストラクターとして呼び出されます (この場合、これは構築される新しいオブジェクトを指します)

MDNの詳細

于 2013-03-19T18:07:06.673 に答える
0

this呼び出しのオブジェクト コンテキストを参照します。

あなたの場合、それはそうwindow.katana(); ですthiswindow

于 2013-03-19T18:08:52.363 に答える