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个赞
以下是理解的关键点
this是运行时绑定,完全根据调用点(函数是如何被调用)而为每次函数调用建立的绑定
let块级作用域,无声明变量隐式声明为全局变量
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] }
添加回答
举报
0/150
提交
取消