JS查找上级作用域

JS查找上级作用域

  • 当前函数执行,形成一个私有作用域A,A的上级作用域是谁,和他在哪执行的没有关系,和他在哪创建(定义)的有关系,在哪创建的,它的上级作用域就是谁
var a = 12;
function fn() {
    //=>arguments:实参集合
    //=>arguments.callee:函数本身FN
    //=>arguments.callee.caller:当前函数在哪执行的,CALLER就是谁(记录的是它执行的宿主环境),在全局下执行CALLER的结果是NULL
    console.log(arguments.callee.caller);
}
function sum() {
    var a = 120;
    fn();
}
function aa() {
    fn();
}
aa();

//输出:
ƒ aa() {
    fn();
}

接下来可以看下这道题

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

JS查找上级作用域_第1张图片大白话:

//var x = fn();
//此时的 fn() ==> return f;  f ==> n++; console.log(n) 
// 在 f()中 没有定义 n  所以往上级作用域寻找 n  在fn()中 n =20
// 所以 先回执行  n++ console.log(n)  输出 21 
// 然后在 执行 x()   此时x()==>f()  也就是 n++ console.log()
// 由于是闭包 所以 n 不会不销毁  一直叠加  22   
//x()   同理  ==》23
// console.log(n);   不会去寻找闭包中的n  所以是全局变量 10

你可能感兴趣的:(JS,面试)