1、什么是作用域
在 JavaScript 中, 作用域为可访问变量,对象,函数的集合
2、有哪几种作用域
全局作用域
函数作用域
块级作用域
模块作用域
3、作用域的作用
隔离变量,不同作用域下同名变量不会有冲突
4、作用域与执行上下文的区别与联系
区别:
1、全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了。而不是在函数调用时
全局执行上下文环境是在全局作用域确定之后,js代码马上执行之前创建
函数执行上下文环境是在调用函数时,函数体代码执行之前创建
2、作用域是静态的,只要函数定义好了就一直存在,且不会再变化
上下文环境是动态的,调用函数时创建,函数调用结束时上下文环境就会被释放
联系:
上下文环境是从属于所在的作用域
全局上下文环境==>全局作用域
函数上下文环境==>对应的函数作用域
5、什么是作用域链
多个上下级关系的作用域形成的链,它的方向是从内到外
查找变量时就是沿着作用域来查找的
查找一个变量的查找规则
在当前作用域下的执行上下文中查找对应的属性,如果有直接返回,否则进入上一级作用域
在上一级作用域的执行上下文中查找对应的属性,如果有直接返回,否则进入上上一级作用域,如果也没有则会继续向上层寻找,直到找到全局作用域为止,如果全局作用域还找不到就抛出异常
例子1
<script>
var x = 10
function fn(){
console.log(x);
}
function show(f){
var x = 20
f()
}
show(fn)//10
</script>
例子2
var fn = function(){
console.log(fn);
}
fn()
var a = 3
var obj = {
a:1,
fn2:function(){
//console.log(this.fn2)
console.log(fn2);
console.log(a);
}
}
obj.fn2()