Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save chengjianhua/b4f8517d057663d24a86aaa81e6a60ac to your computer and use it in GitHub Desktop.
Save chengjianhua/b4f8517d057663d24a86aaa81e6a60ac to your computer and use it in GitHub Desktop.
/*eslint-disable*/
var foo = { n: 1};
(function(foo) {
console.log(foo.n);
foo.n = 3;
var foo = { n: 2 };
console.log(foo.n);
}(foo));
console.log(foo.n);
var foo = { n: 1};
(function(foo) {
// 这里是变量提升, 你应该懂吧, 不懂的话现在记住了.
// 我查阅了文档, 一个函数的形参的声明是优先于内部代码中的变量声明之前的, 所以这一行相当于无效.
var foo;
// 这里理所应当是 "1"
console.log(foo.n);
// 首先, 局部变量优先于外部变量所以这里是形参声明的 foo, 没疑问吧 ?
// 这里就是你所疑惑的地方, 我查阅文档说明: 形参实际上是一个新声明的变量, 赋值为实参也就是外面的 foo
// 但是在 javascript 中将对象赋值给变量, 这个变量其实是个引用, 引用就是个地址, 赋值给形参中的 foo 时
// 其实也就是让形参 foo 也指向对象 { n: 1}. 此时 foo.n = 3 将直接修改这个外部的 foo 指向的对象 (也是内部的 foo 此时指向的对象)
foo.n = 3;
// 这里前面也提到了. 形参中的 foo 其实是一个已经隐含声明的变量, 且 inner 的优先级高于 outer
// 所以此时就是将形参指向另一个对象 { n: 2 };
foo = { n: 2 };
// inner 高于 outer, 所以读取的是形参的值 "2"
console.log(foo.n);
}(foo));
// 之前在函数中被引用改变了, foo.n = 3. 所以此时结果为 "3"
console.log(foo.n);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment