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
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
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
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 comprendrezBien 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 :
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.