在this post中,作者正在使用:
$.fn.wPaint = function(settings) {
settings = $.extend({}, defaultSettings, settings || {});
问:那不会覆盖调用范围的设置变量吗?我认为你想要创建一个新变量,这意味着你总共有3个变量:
答案 0 :(得分:4)
对象总是通过引用传递。
在您的代码中,您只是说局部变量settings
将指向不同的对象。所以你通过引用传递对象然后你说“好吧,我不再对那个引用感兴趣了,指向那个其他对象”。
要清楚,如果你有:
var a = {foo: "bar"};
var b = a;
b = {bar: "foo"};
你不是“摧毁”既不“改变”原始对象{foo: "bar"}
。您只需将b
指向其他对象,a
仍将指向原始对象,因此不会受到影响。
在您的方案中也是如此。
答案 1 :(得分:2)
settings参数是对调用范围中的变量的引用。在函数内部,您将为设置变量分配一个新对象,这会中断引用并将局部变量指向本地范围中的新值。如果您修改了设置而未分配,则会影响调用范围中的设置。参数中的设置是本地范围中的设置。
答案 2 :(得分:1)
在JavaScript中,所有参数都是“按值”传递的。关键是,在settings
的情况下,该值是参考。
这与“通过引用”不同。它可以类似于您仍然在内存中引用相同的对象:
$.fn.wPaint = function(settings) {
settings.foo = 'foo'; // updates object in calling scope
// etc.
};
但是,更改settings
本身只会将自己的值更改为新的引用:
$.fn.wPaint = function(settings) {
settings = $.extend(...);
};
答案 3 :(得分:1)
如果你想这样做,你需要在对象setting
内传递{}
。
$.fn.wPaint = function(settingsContainer) {
settingsContainer.settings = $.extend({}, defaultSettings, settings || {});
-
var settingsContainer = {settings:originalSettings};
$.fn.wPaint(settingsContainer);
originalSettings = settingsContainer.settings;
答案 4 :(得分:1)
您可以将settings
对象作为函数$.extend
的第一个参数传递:
$.fn.wPaint = function(settings) {
$.extend(settings, defaultSettings, settings || {});
}
请参阅此示例http://jsfiddle.net/26Bst/并阅读API entry了解详情。