offensichtlich ist b
nicht so definiert, dass es eine globale Variable
Nur in losem Modus worden ist. Verwenden Sie nicht den lockeren Modus. :-) Benutze den strikten Modus, wo es der Fehler sein sollte, den es immer hätte sein sollen.
jetzt, was passiert, wenn Sie b
im globalen Bereich zu ändern, ändert sich der Wert von a
auch ändern?
Nein, es gibt überhaupt keine Verbindung zwischen a
und b
. Variablen enthalten Werte (mehr dazu unten). Wenn Sie a = b
tun, wird der Wert in b
zu a
kopiert. Es wird keine Verknüpfung zwischen den beiden Variablen erstellt.
Der Interviewer eine Fangfrage sein kann fragen (sie lieben, so zu tun) und/oder er/sie in einen gemeinsamen Fehler zu fallen kann, so lesen Sie weiter ... :-)
ich bin mir nicht sicher, wie dies
testen Da wir in losem Modus sind, wissen wir, dass ein roh-Funktionsaufruf this
gesetzt wird während des Gesprächs auf das globale Objekt zu verweisen. Da die implizite b
global eine Eigenschaft des globalen Objekts sein wird, können wir es überprüfen, indem this.b
Wechsel (die global):
function foo() {
var a = b = 3;
console.log("(Before) a is " + a + ", b is " + b);
this.b = 10;
console.log("(After) a is " + a + ", b is " + b);
}
foo();
(On-Browser könnten wir window
statt this
oben verwenden , wie window
ist ein globaler Standard auf Browsern, die auf das globale Objekt verweist.)
Es ist erwähnenswert, dass, während es nur eine b
gibt, wird b e eine andere a
für jeden Anruf zu foo
in den oben genannten. Aber ich glaube nicht, dass das die Frage wirklich beeinflusst.
In einem Kommentar haben Sie nach "Referenzvariablen" gefragt. In JavaScript gibt es keine "Referenzvariablen". Sie denken wahrscheinlich über Objektreferenzen nach. Die wichtigste Tatsache: Es macht keinen Unterschied zu dem, worüber wir reden (wird sich ändern b
ändern a
?), Ob die Variable eine Objektreferenz oder ein Primitiv enthält.Aber es ist ein üblicher Fehler, in den die Leute fallen (vielleicht sogar der Interviewer, der die Frage stellt :-)), an denken, dass es darauf ankommt. Aber sie sind verwirrend die Änderung b
(die Variable) mit der Änderung des Zustands eines Objekts b
bezieht sich auf.
Variablen enthalten Werte. Wenn Sie einer Variablen einen Objektreferenz zuweisen, ist diese Objektreferenz ein Wert, der die javaScript-Engine mitteilt, wo sich das Objekt im Speicher befindet. Zum Beispiel:
var b = {answer:42};
In Erinnerung haben wir:
+------------+
[b:REF55134]-----| (object) |
+------------+
| answer: 42 |
+------------+
Der Wert in b
ist eine Referenz auf das Objekt. Ich habe es oben als REF55134
dargestellt, aber wir können nie tatsächlich auf den Rohwert dieser Referenz zugreifen. Dieser rohe Wert spielt keine Rolle, es ist nur eine Sache (ähnlich einer Zahl), die der JavaScript-Engine mitteilt, wo sich das Objekt befindet.
Nun, wenn wir dies tun:
var a = b;
... wir kopieren Sie den Wert von b
in a
, und erhalten diese im Speicher:
[b:REF55134]--+
| +------------+
+-->| (object) |
| +------------+
[a:REF55134]--+ | answer: 42 |
+------------+
a
und b
die gleiche haben Wert in ihnen, und so zeigen sie beide auf das gleiche Objekt.
Die Änderung b
hat immer noch keinen Effekt auf a
. Wo Leute verwirrt werden, ist das, wenn wir den Zustand des Objekts b
Punkte ändern, natürlich können wir diesen geänderten Zustand durch a
auch sehen. Der Wert in b
hat sich nicht geändert, der Zustand der Sache, auf die er verweist, wurde geändert.
Z. B .:
b.question = "Life, the Universe, and Everything";
uns gibt:
[b:REF55134]--+
| +------------------------------------------------+
+-->| (object) |
| +------------------------------------------------+
[a:REF55134]--+ | answer: 42 |
| question: "Life, the Universe, and Everything" |
+------------------------------------------------+
b
nicht ändern, das Objekt geändert. Also natürlich, wenn wir console.log(a.question);
taten, würden wir die berühmte Frage sehen, weil a
und b
auf das gleiche Objekt zeigen.
Wenn wir tatsächlich b
ändern, hat dies keine Auswirkungen auf a
überhaupt:
b = {foo:"bar"};
+------------+
[b:REF14359]----->| (object) |
+------------+
| foo: "bar" |
+------------+
+------------------------------------------------+
[a:REF55134]----->| (object) |
+------------------------------------------------+
| answer: 42 |
| question: "Life, the Universe, and Everything" |
+------------------------------------------------+
Beachten Sie, dass jetzt b
in ihm einen anderen Wert hat, auf ein anderes Objekt Bezug genommen wird.
Warum würde 'a' sich ändern, wenn' b' gemacht wurde? Es wäre nicht einmal, wenn sie beide global wären. – nnnnnn
@nnnnnn Ich bin nicht sicher, was der Kontext ist, wo Variablen durch andere Variablen referenziert werden und in diesem Fall können sie sich ändern, wenn ein anderer – codemonkey
JS-Variablen nicht auf andere Variablen verweisen, beziehen sie sich auf Werte/Objekte. – nnnnnn