Javascript:了解函数中包含的变量

Lan*_*ane 3 javascript

试图围绕Javascript范围,寻找某人解释下面发生的事情.希望它不会帮助我...

var foo = {
  bar: {}
};
(function(foo, bar) {
  foo.bar = 'a';
  bar = 'b';

}(foo, foo.bar))

console.log(foo.bar) // prints 'a', not 'b', how come? 
Run Code Online (Sandbox Code Playgroud)

Que*_*tin 6

您定义了两个变量:

function(foo, bar)
Run Code Online (Sandbox Code Playgroud)

您将两个值传递给它们:

}(foo, foo.bar))
Run Code Online (Sandbox Code Playgroud)

foo是对象的引用(该对象具有一个属性,bar其值是对不同对象的引用)

变量的值bar是对第二个对象的引用.

foo.bar = 'a';
Run Code Online (Sandbox Code Playgroud)

bar用字符串覆盖第一个对象的属性'a'.foo.bar不再是对第二个对象的引用.值bar仍然是对第二个对象的引用.

bar = 'b';
Run Code Online (Sandbox Code Playgroud)

bar用字符串覆盖局部变量'b'.现在没有对第二个对象的引用.第二个对象将被垃圾收集.

console.log(foo.bar)
Run Code Online (Sandbox Code Playgroud)

您输出bar对象的属性值,该值foo是作为引用的值.这是'a'因为您在函数中修改了该属性的值.

  • @SimonSimCity - 本地`bar`变量是**永远不是**对`foo.bar`的引用.您不能引用属性.`foo.bar`和`bar`都是对同一个对象的引用.它们可以独立覆盖.`foo.bar`和`bar`之间没有联系,除了它们有时给出相同的值. (2认同)