Javascript 将值传递给全局变量

Javascript 将值传递给全局变量,javascript,object,global-variables,parameter-passing,Javascript,Object,Global Variables,Parameter Passing,有人对javascript为什么不将对象文本作为值传递给通过函数参数传递的全局变量有合理的解释吗 我是否忽略了一些基本规则 (function(global) { var id = "3543a1354"; global = { name: 'global', getId: function() { return id; } }; })(this.global = this.global || {})

有人对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 || {}))

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

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


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

您正在传递
This.global
到函数,函数中
global
是引用全局
global
的参数

当你说

global = {...}
您现在正在更改
global
所指的内容。由于更改了引用,全局
global
保持不变,而局部
global
引用新指定的对象

在第二种情况下

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

您正在更改本地
global
对象,它实际上是指全局
global
。因此,您正在间接地更改全局
global
。这就是为什么,这会变异全局
global
,而第一个则不会。

参数变量始终是局部变量,因此它们会用相同的名称对全局变量进行阴影处理。“而局部全局指的是新分配的对象。”即使在函数范围内,“全局”也不会改变。你可以签入调试程序当你说
global
,你是说local
global
还是global
global
?该死的,现在我知道这样命名变量是个坏主意。。。我想你想说的是,在函数范围内,值将被分配给局部全局。因此,您只能在函数范围内看到变量“global”的更改。离开函数作用域时,赋值不会影响全局变量“global”。至少这是我从你的解释中理解的。因此,在我的第一条评论中,我指的是调试器没有指示对变量“global”进行任何更改的事实。不管是本地还是全局引用…@crishushu不,本地
global
将被分配一个新对象