美文网首页
【闭包 this 作用域】一道普普通通的测试题

【闭包 this 作用域】一道普普通通的测试题

作者: 薯条你哪里跑 | 来源:发表于2021-06-08 18:01 被阅读0次

题目:

var n = 2;
var obj = {
    n: 30,
    fn: (function (n) {
         n *= 2;
         this.n += 2;
         var n = 5;
         return function (m) {
             this.n *= 2;
             console.log(m + (++n));
         }
    })(n)
};
var fn = obj.fn;
fn(3);
obj.fn(3);
console.log(n,obj.n);

=======考虑下会打印出来什么=======
5
4
3
2
1

公布结果:

9
10
8 60

解析:

第一步:

先看这一段代码
fn内部是个自执行函数,所以此时内部代码已经执行,让我们按照序号看下面代码内的的备注

var n = 2;
var obj = {
    n: 30,
    fn: (function (n) {
         n *= 2;   // 2. n=2*2=4
         this.n += 2;  // 3. n为window.n,值是2*2=4
         var n = 5;   // 4.n赋值为5
         return function (m) {  // 5. 返回一个匿名函数
             this.n *= 2;
             console.log(m + (++n));
         }
    })(n)  //1. 这里的实参取的是var n = 2
};

此时 window.n = 4,并且obj.fn返回了一个匿名函数,并形成闭包内部存留n=5。继续进行

第二步:
var fn = obj.fn;  // 没有啥,把obj.fn(即上面的匿名函数) 赋值给一个新的变量
fn(3);  // 执行匿名函数

具体内部赋值如下

// 执行该函数 fn(3)
function (m) {  // 这里形参m值为传入的3
     // console.log(n) 注意这里如果打印n的话,此时n已经是5啦
        this.n *= 2;   // 执行 fn(3)是调用方为window,所以此时this.n = 4, 计算之后变为8
       console.log(m + (++n));  // 这里的n=5, 3+(++5)计算后输出9,此时n=6
 }

截止到这里控制台打印出9,此时window.n=8, 让我们继续

第三步
obj.fn(3); // 没啥执行这个函数

内部赋值如下:

function (m) {  // 这里形参m值为传入的3
      // console.log(n) 注意这里如果打印n的话,此时n已经是6啦
       this.n *= 2;   // 执行obj.fn(3)是调用方为obj,所以此时this.n = 30, 计算之后变为60
       console.log(m + (++n));  // 上一步说了n=6 , 3+(++6)  计算后输出10
 }
第四步
console.log(n,obj.n); // 输出这两个变量的值,显而易见此时n=8, obj.n = 60

总结

这道题包含了闭包、this指向、作用域等等问题,还是需要进一步好好消化和理解的~

相关文章

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • 【闭包 this 作用域】一道普普通通的测试题

    题目: =======考虑下会打印出来什么=======54321 公布结果: 解析: 第一步: 先看这一段代码f...

  • 2018-01-07 关于javascript闭包和作用域的理解

    关于 javascript 闭包的一些思考 作用域 词法作用域 函数作用域 块作用域 闭包 什么是作用域? 作用域...

  • javaScript门道之闭包

    闭包的学习路径:变量的作用域 -> 闭包的概念 ->闭包的应用 1.变量的作用域 变量的作用域分为作用于全局和作用...

  • 14.JS基础之作用域与闭包

    作用域: 全局作用域 函数作用域 块级作用域(ES6新增) 常见的闭包有:作为函数返回值的闭包与作为函数参数的闭包...

  • js作用域、闭包

    闭包 闭包作用 全局 局部 作用域链

  • 执行环境 & 作用域 & 闭包

    执行环境 & 作用域 & 闭包 执行环境 , 作用域 , 闭包 , 闭包应用 执行环境 执行环境定义了 当前环境的...

  • js 总结七07-19

    作用域 全局 局部 作用域链 闭包

  • 2023-01-12

    变量提升调用栈块级作用域作用域链和闭包 闭包 => 作用域链(词法作用域) => 调用栈(栈溢出) => 上下文...

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

网友评论

      本文标题:【闭包 this 作用域】一道普普通通的测试题

      本文链接:https://www.haomeiwen.com/subject/qirjeltx.html