Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript自执行函数和变量作用域_Javascript_Scope_Self Executing Function - Fatal编程技术网

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”。