2012-03-23 134 views
1

this post,筆者使用:對象是否通過JavaScript中的引用或值傳遞?

$.fn.wPaint = function(settings) { 
    settings = $.extend({}, defaultSettings, settings || {}); 

問:那不是覆蓋設置變量調用範圍是什麼?我想你想創建一個新的變量,這將意味着你有一個共3個變量:

  1. 在封閉範圍的默認設置的參數
  2. 的設置
  3. 本地範圍內的設置

回答

2

settings參數是對調用作用域中變量的引用。在你的函數中,你正在給設置變量賦值一個新的對象,這會中斷引用並將本地變量指向本地作用域中的新值。如果您修改了設置,而不分配給它,則會影響調用範圍中的設置。參數中的設置是本地作用域中的設置。

+0

好的,謝謝。所以如果他沒有使用$ .extend,那麼他會一直覆蓋它?這似乎很脆弱。在https://github.com/zenorocha/jquery-boilerplate/blob/master/jquery.boilerplate.js中,他們正在使用此範圍。 – 2012-03-23 18:52:50

+0

@Pedro,我不明白你的問題。任何時候你有'設置='你會打破任何參考設置有另一個對象。 – mikerobi 2012-03-23 19:10:14

+0

我想我所看到的是,如果調用程序傳遞一個字符串而不是一個對象,那麼我會覆蓋它。雖然我不確定。 – 2012-03-23 19:37:32

4

對象始終按引用傳遞。

在你的代碼中,你只是說本地變量settings將指向不同的對象。所以你通過引用傳遞對象,然後你說:「好吧,我對那個引用不再感興趣,指向那個對象」。

需要明確的是,如果您有:

var a = {foo: "bar"}; 
var b = a; 

b = {bar: "foo"}; 

你不會「毀」既不是「改變」原始對象{foo: "bar"}。您只需將b指向一個不同的對象,a仍然會指向原來的一個,所以不會受到影響。

這與您的情況相同。

1

在JavaScript中,所有參數都是「按值傳遞」的。關鍵是,在settings的情況下,該值是一個參考。

這與「參照」不一樣。它可以是類似的,你仍然引用同一個對象存儲:

$.fn.wPaint = function(settings) { 
    settings.foo = 'foo'; // updates object in calling scope 
    // etc. 
}; 

但是,改變settings本身只是改變了自己的價值,新的參考:

$.fn.wPaint = function(settings) { 
    settings = $.extend(...); 
}; 
+0

「價值是一個參考」。這不是一種錯覺 - 它看起來像一個。 – 2012-03-23 19:00:33

1

如果你想這樣做您需要在對象{}內傳遞setting

$.fn.wPaint = function(settingsContainer) { 
    settingsContainer.settings = $.extend({}, defaultSettings, settings || {}); 

-

var settingsContainer = {settings:originalSettings}; 
$.fn.wPaint(settingsContainer); 
originalSettings = settingsContainer.settings; 
+0

我不認爲我想要這樣做。 – 2012-03-23 19:01:07

1

您可以在settings對象作爲第一個參數傳遞給函數$.extend

$.fn.wPaint = function(settings) { 
    $.extend(settings, defaultSettings, settings || {}); 
} 

見這個例子http://jsfiddle.net/26Bst/和了解更多詳情閱讀API entry

+0

這很奇怪,因爲我console.log(OBJ)和我得到三個(3)變量在obj對象內,但是當我console.log(obj.other),它說未定義。 – 2012-03-23 19:28:20

+0

你究竟在腳本執行流程中調用了'console.log'?你能提供一個jsFiddle嗎? – alextercete 2012-03-23 19:46:34

+0

http://jsfiddle.net/Fg3MG/1/在這裏你可以看到Object包含三個值。 – 2012-03-23 20:19:57

相關問題