彻底搞懂JS作用域和作用域链

作用域和作用域链

作用域:决定了代码区块中变量和其他资源的可见性;

           作用域最大的用处就是变量隔离,不同的作用域先同名变量不会冲突;

·全局作用域和函数作用域

拥有全局作用域:

    ·最外层函数 和在最外层函数外面定义的变量拥有全局作用域

    ·所有末定义直接赋值的变量自动声明为拥有全局作用域

    ·所有window对象的属性拥有全局作用域

作用域是分层的内部可以访问到外层作用域的变量反之则不行;

值得注意的是:

块语句(大括号“{}”中间的语句),如 if 和 switch 条件语句或 for 和 while 循环语句,不像函数,它们不会创建一个新的作用域。
在块语句中定义的变量将保留在它们已经存在的作用域中。

作用域链

当出现自由变量的时候要找到这个自由变量(当前作用域没有定义),就要去他们父级作用域查找,若没有再向上一层去查找;

直到找到全局作用结束;这一层一层的关系就是作用域链

自由变量的取值:要到创建这个函数的作用域查找取值;(强调的是创建而不是调用)

作用域和执行上下文的区别:

执行上下文是执行的时候创建的,随时会改变;作用域是定义的时候确定的不能改变;

同一个作用域下会产生不同的执行上下文环境,从而会产生不同的变量值

JavaScript的执行分为:解释和执行两个阶段,这两个阶段所做的事并不一样:

解释阶段:

  • 词法分析
  • 语法分析
  • 作用域规则确定

执行阶段:

  • 创建执行上下文
  • 执行函数代码
  • 垃圾回收

到这 应该理解了作用域和作用域链了吧!!! 🎉 🎉

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。