javascript - Lors de l'extraction d'une méthode d'un objet, pourquoi l'objet d'origine est-il perdu et celui-ci pointe-t-il vers une fenêtre ?
習慣沉默
習慣沉默 2017-06-15 09:23:03
0
8
925
var label = 2
var obj={
    label:1
    a:function(){
        console.log(this.label);
    }
}
obj.a(); //1
var b = obj.a
b(); //2

Pourquoi b perd-il ainsi l'objet d'origine ? Quel est le principe derrière cela ?

================Supplément : Comment comprendre que celle-ci des fonctions imbriquées pointe vers la fenêtre ? =========================

Si nous disons le ceci d'une fonction, il est déterminé par l'environnement d'exécution lors de son exécution. Par exemple, voici obj.a() L'environnement d'exécution de la fonction est obj, donc cela pointe vers obj, et l'exécution. l'environnement de b() est window, donc cela pointe vers window;

Ensuite, celle de la fonction imbriquée pointe vers window. En plus de dire "cela est stipulé par la spécification syntaxique de JS", comment pouvons-nous le comprendre à partir du principe d'implémentation de JS ?

var label = "windowC"
function showThis(){
    var label = "innerC"
    function innerFun(){
        console.log(this.label)
    }
    innerFun()
}
showThis(); //windowC
習慣沉默
習慣沉默

répondre à tous(8)
黄舟

Pour comprendre cela, vous devez comprendre le contexte d'exécution
Il est recommandé de lire http://www.jianshu.com/p/d647...

洪涛

var b=obj.a; équivaut à var b=function(){console.log(this.label)}; ici équivaut à déclarer une fonction, cela pointe vers window

;
给我你的怀抱

Le b que vous avez déclaré est en fait équivalent à window.b, il n'y a donc rien de mal à imprimer 2. Il est important de comprendre ceci
Lors de l'exécution de obj.a, ceci dans a pointe vers obj,
et b() est équivalent à window.b(), et cela pointe vers window

学霸

J'ai lu le livre sur Elevation 3 récemment, il devrait pouvoir aider l'affiche originale.

Tout d’abord, la notion de périmètre doit être clarifiée.

obj.1()//1, dans ce bloc, la portée de this dans la fonction a est limitée à l'objet obj, donc la valeur de l'étiquette de this est l'étiquette d'attribut que vous avez définie dans la valeur de l'objet obj, cette valeur est 1.

Dans la ligne suivante, vous var a variable b. Notez qu'il est très important que votre variable b soit définie dans la portée globale (fenêtre). Ensuite, vous attribuez la méthode obj.a à b. Ensuite, (frappez au tableau, voici le point important), vous avez exécuté b dans l'environnement de portée globale (fenêtre), et le point de cela doit être déterminé en fonction de l'environnement d'exécution, donc l'étiquette du global scope environnement La valeur passe au 2 que vous avez écrit dans la première ligne.

Si vous ne savez toujours pas comment poursuivre la discussion, cela est basé sur ma compréhension personnelle

Ty80

cela change en fonction de l'environnement d'exécution de la fonction. Si vous souhaitez obtenir le courant this plus tard, vous pouvez d'abord l'enregistrer dans une variable ou utiliser apply/call/bind pour le lier

    a:function(){
        let that = this;
        console.log(that.label);
    }
    //或者在调用的时候使用bind
    let b = obj.a
    b.bind(a)() //1
淡淡烟草味

La valeur de

obj.a stocke simplement l'adresse de la méthode qu'elle représente. Lorsque var b = obj.a时,b变量存放的也是该方法的地址;
而另一方面,全局声明的变量,是window的属性,故window.b == b是成立的;
调用b()时,就相当于window.b()一样。再跟obj.a()comparée, vous comprendrez
Bien sûr, elle pointe vers la fenêtre de l'objet global. C'est normal de mettre un j'aime

大家讲道理

Après avoir lu les réponses de chacun et ajouté ma propre compréhension, j'ai demandé et répondu :

Je l'ai compris en fonction de l'état de stockage de l'obj en mémoire. J'ai aussi rencontré une confusion ici au début :

var obj={
    label:1
    a:function(){
        console.log(this.label);
    }
}

Dans obj, label et 1 sont tous deux stockés dans obj, a est stocké dans obj en tant que variable, l'entité de la fonction correspondant à a est stockée en dehors de obj et obj stocke simplement un pointeur. Par conséquent, le this de obj.a() pointe vers a non pas parce que la fonction d'entité existe, mais parce que la fonction d'entité isolée est dans l'environnement d'exécution de obj lorsqu'elle est appelée De même, this de b() pointe ; à window aussi Parce que lorsqu'une fonction d'entité isolée est appelée, elle se trouve dans l'environnement d'exécution de window

迷茫

En regardant simplement la conclusion, c'est que ce point à l'intérieur de la fonction est déterminé par sa méthode d'appel : si la fonction appartient à l'objet, cela pointe vers l'objet ; si la fonction est appelée indépendamment, cela pointe vers undéfini, et non Le mode -strict pointe vers l'objet global.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal