Last active
May 21, 2017 13:16
-
-
Save chengjianhua/b4f8517d057663d24a86aaa81e6a60ac to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*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