对象是否通过引用或值在JavaScript中传递?

时间:2012-03-23 18:40:13

标签: javascript

this post中,作者正在使用:

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

问:那不会覆盖调用范围的设置变量吗?我认为你想要创建一个新变量,这意味着你总共有3个变量:

  1. 关闭范围中的默认设置
  2. 参数中的设置
  3. 本地范围内的设置

5 个答案:

答案 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了解详情。