在this post,筆者使用:對象是否通過JavaScript中的引用或值傳遞?
$.fn.wPaint = function(settings) {
settings = $.extend({}, defaultSettings, settings || {});
問:那不是覆蓋設置變量調用範圍是什麼?我想你想創建一個新的變量,這將意味着你有一個共3個變量:
- 在封閉範圍的默認設置的參數
- 的設置
- 本地範圍內的設置
在this post,筆者使用:對象是否通過JavaScript中的引用或值傳遞?
$.fn.wPaint = function(settings) {
settings = $.extend({}, defaultSettings, settings || {});
問:那不是覆蓋設置變量調用範圍是什麼?我想你想創建一個新的變量,這將意味着你有一個共3個變量:
settings參數是對調用作用域中變量的引用。在你的函數中,你正在給設置變量賦值一個新的對象,這會中斷引用並將本地變量指向本地作用域中的新值。如果您修改了設置,而不分配給它,則會影響調用範圍中的設置。參數中的設置是本地作用域中的設置。
對象始終按引用傳遞。
在你的代碼中,你只是說本地變量settings
將指向不同的對象。所以你通過引用傳遞對象,然後你說:「好吧,我對那個引用不再感興趣,指向那個對象」。
需要明確的是,如果您有:
var a = {foo: "bar"};
var b = a;
b = {bar: "foo"};
你不會「毀」既不是「改變」原始對象{foo: "bar"}
。您只需將b
指向一個不同的對象,a
仍然會指向原來的一個,所以不會受到影響。
這與您的情況相同。
在JavaScript中,所有參數都是「按值傳遞」的。關鍵是,在settings
的情況下,該值是一個參考。
這與「參照」不一樣。它可以是類似的,你仍然引用同一個對象存儲:
$.fn.wPaint = function(settings) {
settings.foo = 'foo'; // updates object in calling scope
// etc.
};
但是,改變settings
本身只是改變了自己的價值,新的參考:
$.fn.wPaint = function(settings) {
settings = $.extend(...);
};
「價值是一個參考」。這不是一種錯覺 - 它看起來像一個。 – 2012-03-23 19:00:33
如果你想這樣做您需要在對象{}
內傳遞setting
。
$.fn.wPaint = function(settingsContainer) {
settingsContainer.settings = $.extend({}, defaultSettings, settings || {});
-
var settingsContainer = {settings:originalSettings};
$.fn.wPaint(settingsContainer);
originalSettings = settingsContainer.settings;
我不認爲我想要這樣做。 – 2012-03-23 19:01:07
您可以在settings
對象作爲第一個參數傳遞給函數$.extend
:
$.fn.wPaint = function(settings) {
$.extend(settings, defaultSettings, settings || {});
}
見這個例子http://jsfiddle.net/26Bst/和了解更多詳情閱讀API entry。
這很奇怪,因爲我console.log(OBJ)和我得到三個(3)變量在obj對象內,但是當我console.log(obj.other),它說未定義。 – 2012-03-23 19:28:20
你究竟在腳本執行流程中調用了'console.log'?你能提供一個jsFiddle嗎? – alextercete 2012-03-23 19:46:34
http://jsfiddle.net/Fg3MG/1/在這裏你可以看到Object包含三個值。 – 2012-03-23 20:19:57
好的,謝謝。所以如果他沒有使用$ .extend,那麼他會一直覆蓋它?這似乎很脆弱。在https://github.com/zenorocha/jquery-boilerplate/blob/master/jquery.boilerplate.js中,他們正在使用此範圍。 – 2012-03-23 18:52:50
@Pedro,我不明白你的問題。任何時候你有'設置='你會打破任何參考設置有另一個對象。 – mikerobi 2012-03-23 19:10:14
我想我所看到的是,如果調用程序傳遞一個字符串而不是一個對象,那麼我會覆蓋它。雖然我不確定。 – 2012-03-23 19:37:32