1、变量查找的规范
左查询(对等号左边的变量进行寻址)
如果整条作用域链 都没有对应变量的声明;则会在全局自动声明一份
/* var a = 3;
b = a;*/
console.log(b) //全局自动声明一份,3
右查询(对等号非左边的变量进行寻址)
如果整条作用域链 都没有对应变量的声明;则会报错
console.log(c)
2、作用域
变量的查找!!!走作用域链!!!
var x = 10;
function fn() {
console.log(x);
}
function show(f) {
var x = 20;
fn()//调用fn函数的时候会倒回第二行去执行,该作用域没有定义X,往上一层找,全局x=10
}
show(fn);//10
3、经典闭包
//编译阶段就已经生成作用域了!!!
function wrap() {
var a = "a"
return function () {
console.log(a)
}
}
var inner = wrap()
inner()
4、js三座大山&两头神兽
三座大山 : 作用域&作用域链 ; 执行上下文&执行上下文栈 ; 原型&原型链
作用域&作用域链 : 决定了变量的查找规则;左查询 右查询
执行上下文&执行上下文栈:
a.函数调用时 实参如何对应形参
b.给arguments赋值
c.给this赋值
d.闭包
原型&原型链: 决定了属性的查找规则
两头神兽 : 闭包 原型
闭包: 当函数可以记住并访问自己的作用域链时;就会产生闭包
个人理解:
编译阶段就已经有作用域了
一个作用域挂靠一个执行上下文
闭包市场说法 :内部函数使用了外部函数的变量
或者,当函数可以记住并访问自己的作用域链时,就会产生闭包。
记住:指的是->执行上下文的数据
闭包:就是某个函数要挂了,但是不能把变量带走,把数据放到一个容器里面给后面调用者。