请问下面的打印结果为什么会这样

    let x = 5;
    function setFn() {
        let x  =  0;
        return function() {
            console.log(this)
            console.log(x)
            x = x + 1; 
            return x;
        };
    }
    const f1 = setFn();
    const f2 = setFn();
    console.log(f1()); // 1
    console.log(f2()); // 1
    console.log(f1()); // 2
    console.log(f2()); // 2
阅读 2.1k
3 个回答

词法环境在代码写完后其实就确定了,和this不一样,setFn中返回的函数中调用的x是setFn中的,而不是外部的x。
每次setFn调用都会产品一个新的x,所以f1和f2中使用的x不是同一个

1,输出window对象,是因为匿名函数的this指向是window
2,为什么f1和f2输出是一样的?是因为setFn()是一个函数,它属于引用数据类型,把它赋值给f1和f2,复制的实际上是一个指针,它指向存储在对内存的对象,操作完成后,两个变量指向同一个对象。
3,为什么输出顺序是window ,0 ,1呢?是因为我们要打印setFn(),然后先执行这个函数setFn(),函数内有两个打印语句被执行,便输出了window,和第一次的0,这里的下一行语句是x被加上了1。然而我们要打印setFn()函数,最后还要输出函数返回值return x;
当然返回值就是 x = 0 + 1

首先解释下 为什么 x 都是 0 1 0 1 1 2 1 2
记住一句话 闭包函数的变量作用域是在定义的时候而不是调用的时候 你这个x变量定义的时候就是 0
所以 console.log(x) 就是 0 再次 return x+1
而 this 指向最后一次调用它的上下文 很明显这里是 全局 window 对象

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题