我认为最难的闭包(附解决方式有图) - 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

posted @ 2021-08-06 19:00  独舟者  阅读(94)  评论(0)    收藏  举报