作用域
1.理解
就是一块"地盘",一个代码段所在的区域
它是静态的(相对于上下文对象),在编写代码时就确定了
2.分类
(1)全局作用域
(2)函数作用域
(3)没有块作用域(ES6有了)
3.作用
隔离变量,不同作用域下同名变量不会有冲突
作用域与执行上下文
1.区别1
全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定,而不是在函数调用时。
全局执行上下文环境是在全局作用域确定之后,js代码马上执行之前创建
函数执行上下文是在调用函数时,函数体代码执行之前创建
2.区别2
作用域是静态的,只要函数定义好了就一直存在,且不会再变化
执行上下文是动态的,调用函数时创建,函数调用结束时就会自动释放
3.联系
执行上下文(对象)是从属于所在的作用域
全局执行上下文 ----> 全局作用域
函数执行上下文 ----> 对应的函数作用域
作用域链
1..理解
嵌套的作用域由内向外的一个结构
查找变量时就是沿着作用域链来查找的
2.查找一个变量的查找规则
(1)在当前作用域下的执行上下文中查找对应的属性,如果有直接返回,否则进入(2)
(2)在上一级作用域的执行上下文中查找对应的属性,如果有直接返回,否则进入(3)
(3)再次执行(2)的相同操作,直到全局作用域,如果还找不到就抛出找不到的异常
测试题
测试题1
测试题2
测试题3
怎样找到a.b,先找作用域链找到a对象,再找原型链找a的属性b,第一个找不到就报错,第二个找不到就返回undefined
学识浅薄,如有错误,恳请斧正,在下不胜感激。