Javascript自执行函数和变量作用域
有人能给我解释一下这种行为吗Javascript自执行函数和变量作用域,javascript,scope,self-executing-function,Javascript,Scope,Self Executing Function,有人能给我解释一下这种行为吗 var obj = function() { var _bar = 10; function i_bar(){return ++_bar;} return { bar : _bar, i_bar: i_bar } }(); obj.bar // prints 10, OK obj.i_bar() // prints 11, OK obj.bar = 0 // prints 0, OK o
var obj = function()
{
var _bar = 10;
function i_bar(){return ++_bar;}
return {
bar : _bar,
i_bar: i_bar
}
}();
obj.bar // prints 10, OK
obj.i_bar() // prints 11, OK
obj.bar = 0 // prints 0, OK
obj.i_bar() // prints 12, NOK
既然唯一的变量是
\u bar
,那么最后一个obj.i\u bar()
不应该打印1
而不是12
?您的bar
与i\u bar
所引用的引用不同。值类型不是通过引用,因此您正在将bar
复制到返回对象中,但函数所引用的不是bar
。试试这个:
var obj = function()
{
var self = this;
function i_bar(){return ++self.bar;}
self.bar = 10;
self.i_bar = i_bar;
return self;
}();
因为值类型不是通过引用传递的。函数和对象通过引用传递。构造新对象时,您正在制作一个
bar
的副本,但它与函数所引用的bar
不同。您是正确的,并将bar
初始化为对象来修复它。但真正让我困惑的是:我只是声明了变量,但没有给它赋值。之后我做了obj.bar={“foo”:“Hello”}
但是I\u bar
没有注意到这个变化。我猜,由于在创建时没有赋值,javascript决定将其视为一个原语,而不是一个对象,即使在它被更改为一个对象之后也是如此。它将其视为未定义
<代码>未定义+==未定义。设置obj.var={“foo”,“Hello”}
将创建一个通过引用传递的对象。这很奇怪。我修改了它,所以\u bar={“foo”:“Hello”}
和I\u bar(){return\u bar}
。如果我这样做,obj.bar={“foo”:“Bye”}
,obj.bar.foo
将打印“Bye”,但obj.I_bar().foo
仍将打印“Hello”。