【问题标题】:Passing values to global variables将值传递给全局变量
【发布时间】:2014-05-14 01:26:21
【问题描述】:

是否有人有一个合理的解释,为什么 javascript 不将对象文字作为值传递给通过函数参数传递的全局变量?

我是否忽略了一些基本规则?

(function(global) {
    var id = "3543a1354";
    global = {
        name: 'global',
        getId: function() {
            return id;
        }
    };
})(this.global = this.global || {})

所以本质上,执行代码后参数'global'的值是一个空对象。很奇怪:如果例如在最后一行设置断点并在控制台中执行对象字面量赋值,那么该值会正确传递给“全局”。

顺便说一句,这将按预期工作:

(function(global) {
    var id = "3543a1354";
    global.name = "global";
    global.getId = function() {
        return id;
    }
}(this.global = this.global || {}))

【问题讨论】:

  • 参数变量总是局部变量,所以它们会覆盖同名的全局变量。

标签: javascript object global-variables parameter-passing


【解决方案1】:

在这两个函数中,global 是一个局部变量,因为它是一个函数参数。

在第一种情况下,您正在使用文字符号创建一个新对象,并将其分配给局部变量。这对函数调用中使用的变量没有影响。

在第二种情况下,您正在修改局部变量所引用的对象的属性。这与函数调用中使用的变量所引用的对象相同,因此它对调用者可见。

【讨论】:

    【解决方案2】:

    您将this.global 传递给函数,函数内部global 是引用全局global 的参数。

    当你说,

    global = {...}
    

    您现在正在更改 global 所指的内容。由于您更改了引用,因此全局 global 保持不变,本地 global 引用新分配的对象。

    第二种情况,

    global.name = "global";
    global.getId = function () {..}
    

    您正在更改本地 global 对象,它实际上是指全局 global。所以,你间接改变了全局global。这就是为什么,这会改变全局 global 而第一个没有。

    【讨论】:

    • "本地全局引用新分配的对象。"即使在函数范围内,“全局”也不会被改变。您可以在调试器中签入
    • 当你说global时,你是指本地global还是全球global
    • 该死的现在我知道这样命名变量是个坏主意......我想你想说的是,在函数范围内,值将被分配给本地全局。因此,您只能在函数范围内看到变量“全局”的更改。离开函数范围时,赋值不会影响全局变量“global”。至少从你的解释中我是这么理解的
    • 好的。因此,在我的第一条评论中,我指的是调试器并未指示对变量“全局”进行任何更改。无论是本地还是全球参考...
    • @crishushu 不,本地 global 会被分配一个新对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多