将值传递给全局变量

时间:2014-04-02 15:58:31

标签: javascript object global-variables parameter-passing

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

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

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

基本上参数' global'的价值。执行代码后是一个空对象。非常奇怪:如果在最后一行设置断点并在控制台中执行对象文字分配,则该值会正确传递给' global'。

BTW这将按预期工作:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

当你说,

global = {...}

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

在第二种情况下,

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

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