我认为最难的闭包(附解决方式有图) - js难点解决
相同的闭包,不同的地址
function fun(n, o) {
console.log(o)
return {
fun: function(m) {
return fun(m, n)
}
}
}
var a = fun(0)
a.fun(1)
a.fun(2)
a.fun(3)
var a = fun(0)

a.fun(1)
- 预编译

- 执行

a.fun(1)
- 预编译

- 执行

关键在于理解n的变化,n是对象fun(0x20x,x为变量)里面的属性,独自的作用域
为什么fun函数(0x10x,x为变量)的AO地址都会变化,是因为调用a.fun(),a都会产生一个全新的地址,所以每次的n都会取0
相同的闭包,相同地址
var b = fun(0).fun(1).fun(2).fun(3);


形成了完整的闭包,闭包环境就像函数里的函数,每次调用,fun函数(0x10x,x为变量)的AO地址不会变化
var b = fun(0).fun(1)
b.fun(2)
b.fun(3)
原理和第一个相通,但此时闭包环境把a.fun(1)包含在里面了,此时修改了n(0x20x,x为变量),n为1

浙公网安备 33010602011771号