为了账号安全,请及时绑定邮箱和手机立即绑定

求解题过程

求解题过程

天天向上学 2019-01-22 21:05:37
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 回答

已采纳
?
pardon110

TA贡献1038条经验 获得超227个赞

以下是理解的关键点

  1. this是运行时绑定,完全根据调用点(函数是如何被调用)而为每次函数调用建立的绑定

  2. let块级作用域,无声明变量隐式声明为全局变量

  3. js中闭包函数对外部函数的“私有数据”依赖及立即执行函数的意义

详细注解如下

let n = 10,obj = {n: 20};
let fn = obj.fn = (function () {
console.log('outer n... '+n,'this.n...'+this.n)
   this.n++;       // 闭包(内部)函数持有它,在外层函数调用完毕不会释放,
   n++;            // 同上,类似于闭包的”私有数据”,但n有点不一样,相当于引用且声明了一个全局变量
   return function (m) {  // 返回闭包函数,形参为m也就是后续obj.fn的实参10
console.log('inner n...' + 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); //  有调用者obj this不是编写时绑定,而是运行时绑定
console.log (n, obj.n); 
console.log(obj)    // 查看执行后obj对象结构

输出结果

outer n... 10 this.n...undefined  // 私有数据初始化,执行一次,始终与obj.fn,fn绑定
inner n...11  this.n...NaN
32
inner n...32  this.n...20
53
53 73
{ n: 73, fn: [Function] }


查看完整回答
1 反对 回复 2019-01-23
  • 1 回答
  • 0 关注
  • 685 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信