まず、コードの一部を見て、この役割を感じてください。
place='out'; function where(){ var place='in'; alert(place); //in alert(this.place); //out } where();
このことから、place は関数内の変数を取得するのに対し、this.place は外部変数の値を取得することがわかります。どうしてこれなの?実際、この役割は、現在の関数を実行する外部環境オブジェクトを指すことです。実行時の環境 where here はグローバル環境なので、 this が global (ブラウザのウィンドウ) を指すと、 this.place はグローバル変数 place を取得します。
以下のコードを通じて確認してください。
place='out'; passer={ var place: 'in', askWhere: function(){ alert(this.place); //in }, }; passer.askWhere();
これはaskWhereが指す関数内にあり、関数実行の外部環境はpasserオブジェクトなので、this.placeが取得するものはpasserオブジェクトを指します。
次に、次のコード部分を見てください。これにより、関数内でどのような違いが生じるでしょうか?
function Passer(){ this.place = 'in'; this.askWhere = function(){ alert( this.place ); //in } } alert(window.place); //undefined Tom = new Passer(); Tom.askWhere();
前の理論的分析によれば、Passer の this がグローバルを指している場合、this.place はグローバル環境内の場所を定義する必要があります。なぜ window.place = unknown が発生するのでしょうか。
新規通話と通常通話の違いがここに反映されています。実際、新しい操作中にいくつかのステップが実行されます:
1.创建一个新的对象(并把空对象的__proto__属性设置为Passer.prototype)。 2.将构造函数的作用域赋给新对象(此时this 指向了这个新对象)。 3.执行构造函数中的代码(通过this 为这个新对象添加属性) 4.返回新对象。
つまり、これは実際には世界的な状況を指しているのではなく、新しいオブジェクトを指しているのです。次に、askWhere を実行すると、関数内の this もこの新しいオブジェクトの内部を指します。
ここでコンストラクター Passer が通常の呼び出しを行う場合、結果は最初の分析と一致します。
要約: 関数で new を呼び出すときの this の動作の基本的な理由は、新しいオブジェクトが作成され、コンストラクターのスコープが新しいオブジェクトに割り当てられ、これにより this が新しいオブジェクトを指すようになるためです。実際、現在の関数を実行する外部環境オブジェクトを指す this の役割は変わっていません。
以上がjs関数の新規呼び出しと通常の呼び出しの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。