2015-11-19 51 views
4

我知道Javascript中的對象是通過引用複製/傳遞的。但功能呢?通過值或引用複製/傳遞的js中的函數

當我跳到一些令人困惑的事情時,我試着用這段代碼。以下是代碼片段:

x = function() { console.log('hey 1'); } 
 

 
y = x; 
 

 
x = function() { console.log('hey 2'); } 
 

 
y; // Prints function() { console.log('hey 1'); }

如果狀物體的功能被複制/按引用傳遞,爲什麼不更新y以打印「哎2」?

如果這種行爲是因爲'x'被分配了一個全新的函數,當x改變時,是否有任何方法將變量'y'分配給新分配的函數?

+0

如果你使用'{x:1}'和'{x:2}'而不是'function(){console.log('hey 1'),那麼這種行爲是相同的。 }'和'function(){console.log('hey 2'); }'。你目前的措辭使得它聽起來像你正在觀察對象與功能的不同模式,但事實並非如此。 – apsillers

+0

我幾乎在所有的編程語言中都發現一個常量,''='操作符只會修改它引用的變量(如實際引用「x」)而不是基礎數據。如果一個類型具有'.modify()'或'.add()'方法,那麼這是底層數據可以更改以便通過多個變量可見的一種方式。 – Katana314

+0

對不起 - 自我警告:在JavaScript中,'='用於修改對象的屬性,當然可以被其他引用看到。例如:'var b = a; a.myprop = 3; console.log(b.myprop);' – Katana314

回答

5

JS中的一切都是按值傳遞其中對象和函數的值是引用。

這裏發生的事情是將與對象發生(因爲函數只是first-class objects)同樣的事情:

這裏是發生了什麼事情的要點:

x = function() { console.log('hey 1'); } 

xfunction() that logs 1(爲此功能創建內存)

y = x; 

yfunction() that logs 1(相同的內存位置)

x = function() { console.log('hey 2'); } 

x現在指向一個function() that logs 2(一個新的內存空間),沒有什麼影響y雖然

y; 

y仍指向同一function() that logs 1


如果你想有改變x影響y,你應該做的是改變他們指向的事情,不能改變什麼他們指向

例如:

var pointingAtMe = { log: function() { console.log('1'); } } 
var x = pointingAtMe; 
var y = pointingAtMe; 

// change the actual thing x and y are both pointing to 
x.log = function() { console.log('2'); } // this line also sets `y.log` and `pointingAtMe.log`since they all point to the same thing 
// and the change gets applied to both 
y.log(); // logs '2' 
0

x = function() { console.log('hey 2'); }不改變x變量中包含的對象,而是修改x變量的內容。

1

如果類似對象的功能被複制/通過引用傳遞,爲什麼不更新y以打印 '哎2'?

您正在做出錯誤的假設。在JavaScript中一切都是pass-by-value。對象表示爲引用是正確的,但與pass-by-reference不同。

即使你使用的不是功能的普通對象,你不會看到你所期望的:

var x = {foo: 42}; 
var y = x; 
x = {foo: 21}; 
console.log(y.foo); // still 42 

傳遞按值/參考僅介紹如何變量參數已解決,它與變量的值沒有任何關係。

如果這種行爲是因爲'x'被分配了一個全新的函數,當x改變時,是否有任何方法將變量'y'分配給新分配的函數?

不是,沒有明確指定爲y