2016-08-13 5 views
0

Ich habe Zweifel über die folgenden Codes. Ich dachte, dass Datentypen-Grundelemente, die einer Variablen in JS zugewiesen sind, als Wert übergeben wurden, während Objekte als Referenz übergeben wurden. Wenn Funktionen Objekte in JS sind, dachte ich, sollten sie als Referenz übergeben werden, aber die beiden folgenden Codes verhalten, als Wert übergeben:JavaScript Funktionsausdruck einer Variablen zugewiesen (Referenz oder Wert?)

CODE 1

var x = function hello(){ console.log("hello")}; 

console.log(x); 

var y = x; 

console.log(y); 

x = function bye(){console.log("bye")}; 

console.log(x); 

console.log(y); 

OUTPUT

[Function: hello] 
[Function: hello] 
[Function: bye] 
[Function: hello] 

CODE 2

In diesem Fall zugewiesen ich eine Methode auf eine globale Variable und das Verhalten ist das gleiche:

var x = {name:"Max", 
     action: function one(){console.log("one")} 
} 

var y = x.action; 

console.log(y); 

x.action = function two(){console.log("two")}; 

console.log(x.action); 

console.log(y); 

OUTPUT

[Function: one] 
[Function: two] 
[Function: one] 

Ich schätze wirklich jede Einsicht und Erklärung zu diesem Thema.

+2

Sie Variablen neu zuweisen. Sie nicht durch Referenz ändern. –

+2

JS wird nicht als Referenz übergeben. Übergeben Sie immer nach Wert, aber dieser Wert kann eine Referenz sein. – Oriol

+0

Vielen Dank für Ihre Antwort Niet. Wie könnte ich in Code 1 die Funktion "Hallo" ändern, die der Variablen x als Referenz zugewiesen wurde, anstatt sie neu zuzuweisen? –

Antwort

0

In diesem Code y wird keine Referenz von x später, x ist mit einer neuen Funktion neu zugewiesen. Wenn Sie eine Eigenschaft in x ändern, wird y immer noch eine Referenz von x dann sein.

Das gleiche passiert mit jedem Objekt in JS.

0

Sie weisen Funktionen einfach Variablen zu, es gibt nichts Schwieriges in diesem Code und es funktioniert wie es sollte, fühlen Sie sich frei, etwas mehr zu fragen.

2

Von diesem Aspekt ist JavaScript Pass-by-Value.

Wenn Sie der Variablen Y die Variable X zuweisen, wird der Wert von X in Y abgelegt, auch wenn der Wert von X eine Referenz auf ein Objekt ist.

Sie können die „by reference“ Natur sehen, die Sie suchen, wenn Sie eine tiefere Eigenschaft in einem Objekt ändern:

var x = { foo:() => "bar"; } 
var y = x; 

x.foo =() => "baz"; 

y.foo(); // "baz", and not "bar". 

Wenn ich x-{ foo:() => "baz" } zu setzen, würde y.foo() immer noch zu "bar", weil ich das ursprüngliche Objekt nicht geändert habe, habe ich es durch ein anderes ersetzt.


Um zu klären, macht JavaScript nicht haben var x = &y; oder etwas ähnliches wie in PHP.

+0

Vielen Dank für Ihre Antwort Madara. Ich kenne das von Ihnen gepostete Beispiel. Nun, wie könnte ich in Code 1 die Funktion Hallo, durch Referenz ändern? –

0

Pass by Referenz/Wert ist hier nicht wichtig, da keine Passing beteiligt ist.

Die Werte, die diese Variable enthält, sind ein Verweis auf eine Funktion. Ich denke, was Sie erwarten, ist, dass y und x sind irgendwie nach der Zuweisung verknüpft, aber die Zuordnung ändert nur, welche Funktion y bezieht sich auf ohne weitere Zuordnung zu x.

Erste x hält eine Referenz auf hello, dann y wird eine Referenz auf hello zu halten, dann x wird eine Referenz auf bye enthalten. Also am Ende, x enthält einen Verweis auf bye, und y enthält einen Verweis auf Hallo. Diese

ist im Grunde das gleiche wie:

var x = "hello"; 
var y = x; 
x = "bye"; 

console.log(x); 
console.log(y); 
Verwandte Themen