求解题过程

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);

求解题过程

天天向上学
浏览 686回答 1
1回答

pardon110

以下是理解的关键点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] }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript