闭包练习题

1、

var a = 10
function foo(){
    console.log(a)
}

function sum() {
    var a = 20
    foo()
}

sum()
/* 输出
    10
/

函数 foo() 是在全局下创建的,所以 a 的上级作用域就是 window,输出就是 10

2、

var n = 10
function fn(){
    var n =20
    function f() {
       n++;
       console.log(n)
     }
    f()
    return f
}

var x = fn()
x()
x()
console.log(n)
/* 输出
*  21
    22
    23
    10
/

思路:fn 的返回值是什么变量 x 就是什么,这里 fn 的返回值是函数名 f 也就是 f 的堆内存地址,x() 也就是执行的是函数 f(),而不是 fn(),输出的结果显而易见

 

3、

 // 全局变量
      var x = 1;
      //   对象
      var obj = {
        x: 2,
      };
      //
      obj.fn = (function (x) {
        this.x *= x++; //x++   先返回原值 参加运算  后自++
        return function (y) {
          x += y;
          this.x *= ++x; //++x   变量先自加1参加运算  后 返回值
          console.log(x);
        };
      })(obj.x);
      //
      var fn = obj.fn;//自执行函数  返回的函数
      obj.fn(2); //6          //调用 返回的函数 obj调用  this指向obj
      fn(1); //8   //调用返回的函数  全局变量fn调用   this指向window
      console.log(obj.x, x);//12  16

 

posted @ 2021-05-17 21:24  一个动态类型的幽灵  阅读(137)  评论(0编辑  收藏  举报