Maison  >  Article  >  interface Web  >  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

一个新手
一个新手original
2017-09-27 10:29:591311parcourir

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();

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();

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();

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.返回新对象。

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!

Déclaration:
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