作用域和作用域链
作用域:决定了代码区块中变量和其他资源的可见性;
作用域最大的用处就是变量隔离,不同的作用域先同名变量不会冲突;
·全局作用域和函数作用域
拥有全局作用域:
·最外层函数 和在最外层函数外面定义的变量拥有全局作用域
·所有末定义直接赋值的变量自动声明为拥有全局作用域
·所有window对象的属性拥有全局作用域
作用域是分层的内部可以访问到外层作用域的变量反之则不行;
值得注意的是:
块语句(大括号“{}”中间的语句),如 if 和 switch 条件语句或 for 和 while 循环语句,不像函数,它们不会创建一个新的作用域。
在块语句中定义的变量将保留在它们已经存在的作用域中。
作用域链
当出现自由变量的时候要找到这个自由变量(当前作用域没有定义),就要去他们父级作用域查找,若没有再向上一层去查找;
直到找到全局作用结束;这一层一层的关系就是作用域链
自由变量的取值:要到创建这个函数的作用域查找取值;(强调的是创建而不是调用)
作用域和执行上下文的区别:
执行上下文是执行的时候创建的,随时会改变;作用域是定义的时候确定的不能改变;
同一个作用域下会产生不同的执行上下文环境,从而会产生不同的变量值
JavaScript的执行分为:解释和执行两个阶段,这两个阶段所做的事并不一样:
解释阶段:
- 词法分析
- 语法分析
- 作用域规则确定
执行阶段:
- 创建执行上下文
- 执行函数代码
- 垃圾回收
到这 应该理解了作用域和作用域链了吧!!! 🎉 🎉
网友评论