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);
大白话:
//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