ホームページ > ウェブフロントエンド > jsチュートリアル > js関数の新規呼び出しと通常の呼び出しの違い

js関数の新規呼び出しと通常の呼び出しの違い

一个新手
リリース: 2017-09-27 10:29:59
オリジナル
1388 人が閲覧しました

まず、コードの一部を見て、この役割を感じてください。

        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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート