快捷导航

求解题过程

let n = 10,        obj = {n: 20};let fn = obj.fn = (function () {    this.n++;    n++;    return function (m) {        n += 10 + (++m);        this.n += n;        console.log(n);    }})(obj.n);fn(10);obj.fn(10);console.log (n, obj.n);求解题过程

免责声明:本内容仅代表回答者见解不代表本站观点,请谨慎对待。

版权声明:作者保留权利,不代表本站立场。

回复

使用道具 举报

参与会员1

以下是理解的关键点


  • this是运行时绑定,完全根据调用点(函数是如何被调用)而为每次函数调用建立的绑定
  • let块级作用域,无声明变量隐式声明为全局变量
  • js中闭包函数对外部函数的“私有数据”依赖及立即执行函数的意义
详细注解如下
letn=10,obj={n:20};letfn=obj.fn=(function(){console.log('outern...'+n,'this.n...'+this.n)this.n++;//闭包(内部)函数持有它,在外层函数调用完毕不会释放,n++;//同上,类似于闭包的”私有数据”,但n有点不一样,相当于引用且声明了一个全局变量returnfunction(m){//返回闭包函数,形参为m也就是后续obj.fn的实参10console.log('innern...'+n,'this.n...'+this.n)n+=10+(++m);//改变全局部变量n,对obj.fn,fn的每次调用皆会改变它this.n+=n;//改变了调用者对象(若存在时)的n属性值console.log(n);}})(obj.n);//立即执行函数,此处的obj.n只是个实参,未参与内部运算无实际意义,可以不存在fn(10);//无调用者,其调用不会改变obj.fn(10);//有调用者objthis不是编写时绑定,而是运行时绑定console.log(n,obj.n);console.log(obj)//查看执行后obj对象结构输出结果
outern...10this.n...undefined//私有数据初始化,执行一次,始终与obj.fn,fn绑定innern...11this.n...NaN32innern...32this.n...20535373{n:73,fn:[Function]}
回复

使用道具 举报

可能感兴趣的问答

发新帖
  • 微信访问
  • 手机APP