有人有一个合理的解释,为什么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 || {}))
答案 0 :(得分:1)
在这两个函数中,global
是一个局部变量,因为它是一个函数参数。
在第一种情况下,您使用文字符号创建新对象,并将其分配给局部变量。这对函数调用中使用的变量没有影响。
在第二种情况下,您将修改局部变量引用的对象的属性。这与函数调用中使用的变量所引用的对象相同,因此调用者可以看到它。
答案 1 :(得分:1)
您正在将this.global
传递给该函数,而函数global
内部是引用全局global
的参数。
当你说,
global = {...}
您现在正在更改global
所指的内容。由于您更改了引用,因此全局global
保持不变,本地global
引用新分配的对象。
在第二种情况下,
global.name = "global";
global.getId = function () {..}
您正在更改本地global
对象,该对象实际上是指全局global
。所以,你间接地改变了全球global
。这就是为什么,这会改变全球global
而第一个没有。