Maison > interface Web > js tutoriel > La différence entre le nouvel appel de la fonction js et celui-ci lors d'un appel ordinaire

La différence entre le nouvel appel de la fonction js et celui-ci lors d'un appel ordinaire

一个新手
Libérer: 2017-09-27 10:29:59
original
1385 Les gens l'ont consulté

Regardez d'abord un morceau de code pour en ressentir le rôle.

        place='out';                    
            function where(){
                    var place='in';
                    alert(place);         //in
                    alert(this.place);    //out
                    }

                    where();
Copier après la connexion

On peut voir à partir de cela que place obtient les variables à l'intérieur de la fonction, tandis que this.place obtient la valeur de la variable externe. Pourquoi est-ce ? En fait, le rôle de ceci est de pointer vers l'objet d'environnement externe qui exécute la fonction actuelle. L'environnement lors de l'exécution où voici l'environnement global, donc cela pointe vers global (fenêtre dans le navigateur), alors this.place obtient la variable globale place.

Vérifiez via le code suivant.

       place='out';
                    passer={                        var place: 'in',
                        askWhere: function(){
                            alert(this.place);   //in
                        },
                    };

                    passer.askWhere();
Copier après la connexion

C'est ici dans la fonction pointée par AskWhere. L'environnement externe pour l'exécution de la fonction est l'objet passeur, donc cela pointe vers l'objet passeur, et ce dans quoi se trouve this.place.

Ensuite, regardez le morceau de code suivant. Quelles différences cela entraînera-t-il dans la fonction ?

                    function Passer(){
                        this.place = 'in';                        this.askWhere = function(){
                            alert( this.place );    //in
                        }
                    }
                    alert(window.place);            //undefined
                    Tom = new Passer();
                    Tom.askWhere();
Copier après la connexion

Si selon l'analyse théorique précédente, this dans Passer pointe vers global, alors this.place devrait définir place dans l'environnement global. Pourquoi window.place = undefined se produit-il ?

La différence entre un nouvel appel et un appel ordinaire se reflète ici. En fait, plusieurs étapes sont réalisées lors de la nouvelle opération :

                1.创建一个新的对象(并把空对象的__proto__属性设置为Passer.prototype)。

                2.将构造函数的作用域赋给新对象(此时this 指向了这个新对象)。

                3.执行构造函数中的代码(通过this 为这个新对象添加属性)

                4.返回新对象。
Copier après la connexion

Il ne s'agit donc pas ici réellement du monde global, mais d'un nouvel objet. Ensuite, lors de l'exécution de AskWhere, this dans la fonction pointe également vers l'intérieur de ce nouvel objet.

Si le constructeur Passer effectue ici un appel normal, le résultat est cohérent avec notre analyse initiale.

Résumé : La raison fondamentale du comportement de this lors de l'appel de new sur une fonction est qu'un nouvel objet est créé et que la portée du constructeur est assignée au nouvel objet, ce qui fait ressortir le nouvel objet. . En fait, le rôle de ce pointant vers l'objet d'environnement externe qui exécute la fonction actuelle n'a pas changé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal