1.作用域
在 Javascript 中,作用域分为 全局作用域 和 函数作用域
全局作用域:
代码在程序的任何地方都能被访问
备注:window 对象的内置属性都拥有全局作用域。
函数作用域:
在固定的代码片段才能被访问
1.1 作用域-上下级
作用域有上下级关系,上下级关系的确定就看函数在哪个作用域下创建的;
例子说明一下
如图:fn作用域下创建了bar函数,那么“fn作用域”就是“bar作用域”的上级;
1.2 作用域-用处
作用域最大的用处就是隔离变量,不同的作用域下同名变量不会冲突。
变量取值: 到创建这个变量的函数 的作用域 中去变量;
2. 作用域链
2.1 定义
一般情况下,变量取值到 创建 这个变量的函数 的作用域中取值。
但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
举个例子
var x = 10;
function fn(){
console.log(x);
}
function show(f){
var x = 20;
f();
}
show(fn);
答案
10
解释:
》因为fn函数内部作用域没有创建x,就是去fn函数上级获取变量;
》fn函数常见在window, fn函数上级获取变量,即获取到var x = 10;
》所以当window调用 show()函数的时候,指向的是window, 因此show函数中f()指的是外部定义的function fu(){};
》所以最终输出 10
3. 总结:
1. 上下级关系的确定就看函数在哪个作用域下创建的;
2.一般情况下,变量取值到 创建 这个变量的函数 的作用域中取值;
关键字:到创建这个变量的函数 的作用域 中取值
3.如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域;
关键字:会向上级作用域查找,一层一层到全局作用域;
在看一个例子
var a = 10;
function fn() {
var b = 20;
function bar() {
console.log(a+b)
}
return bar;
}
var x = fn(),
b = 200;
x()
答案:
30
画图解释变量取值:
这个函数是不是看起来很熟悉,不用怀疑,就是后面一个JavaScript重要知识点--闭包;