【问题标题】:Javascript pass by reference and local variable assignmentJavascript 通过引用传递和局部变量赋值
【发布时间】:2014-06-26 20:58:36
【问题描述】:

我的问题与this post 有关,但我仍然遇到问题。

如果我在命名空间中有两个数字

var global_namespace = {a:3, b:5};

我的其余代码是

function change() {
    var a = this.global_namespace.a;
    var b = this.global_namespace.b;

    a += 2;
    b *= 2;
}

console.log(global_namespace.a + " " + global_namespace.b);
change();
console.log(global_namespace.a + " " + global_namespace.b);

我想声明对命名空间中的变量的引用,但是当我观察调试器时,本地的 a 和 b 变量发生了变化,而没有更新命名空间中的变量。我试图引用全局命名空间 vars 的全部原因是允许在整个函数中使用较短的 var 名称以提高可读性。不过,我不能通过在函数范围内存储命名空间的副本来牺牲潜在的双倍内存。

【问题讨论】:

  • 您为什么希望全局变量得到更新?您使用了var,它在当前词法范围内创建了一个局部变量。你必须像 global_namespace.a += 2 这样递增
  • var ab 只是一个数字,它不是通过引用传递的。
  • 有没有办法将 a 和 b 声明为对命名空间变量的引用?我知道递增 global_namespace.a += 2 有效,但是我试图避免每次引用其中一个变量时都必须编写这么长的代码(代码可读性超出了窗口)。同时,我不能只做一个本地副本,更改它,然后将其重新分配给全局命名空间,因为我担心内存大小会增加一倍。
  • 您可以制作“global_namespace”的本地副本:var gn = global_namespace; 然后gn.a += 2; 等。但是不,您不能将变量作为另一个变量或对象属性的“别名”。
  • 所有变量都有一个。在分配对象的情况下(例如var a = {}),该值是一个reference。对于原语(例如var b = 3),该值是原语值。所以在var c = a 中,a 的值是对对象的引用,因此将等效引用分配给c。对于var d = b,赋值等于b的值(即3)。

标签: javascript namespaces pass-by-reference


【解决方案1】:

如果你想通过引用改变变量,你应该这样做

var global_namespace = {a:3, b:5};

function change() {
    global_namespace.a += 2;
    global_namespace.b *= 2;
}

console.log(global_namespace.a + " " + global_namespace.b);
change();
console.log(global_namespace.a + " " + global_namespace.b);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2011-11-06
    • 2018-01-12
    相关资源
    最近更新 更多