90、JS作用域和作用域链

转自:https://blog.csdn.net/jbj6568839z/article/details/106618708

一、作用域的定义

(1)作用域:

  1. 一段程序代码中所用到的名字并不总是有效,而限定它的可用性范围就是这个名字的作用域;
  2. 确定当前执行代码对变量的访问权限;

(2)全局变量:任何地方都能访问到的对象拥有全局作用域

  1. 函数外定义的变量
  2. 所有末定义直接赋值的变量自动声明为拥有全局作用域

(3)局部变量:只能在函数中访问,该函数外不可访问

  1. 定义在函数中的变量

 二·、作用域链

(1) 当查找变量的时候都发生了什么?(什么是作用域链)

  1. 会先从当前上下文的变量对象中查找;
  2. 如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找;
  3. 一直找到全局上下文的变量对象,也就是全局对象
  4. 作用域链的顶端就是全局对象

这样由多个执行上下文的变量对象构成的链表就叫做作用域链,从某种意义上很类似原型和原型链。

(2) 作用域链和原型继承查找时的区别:

  • 查找一个普通对象的属性,但是在当前对象和其原型中都找不到时,会返回undefined
  • 查找的属性在作用域链中不存在的话就会抛出ReferenceError

(3) 作用域嵌套

既然每一个函数就可以形成一个作用域(词法作用域 || 块级作用域),那么当然也会存在多个作用域嵌套的情况,他们遵循这样的查询规则:

  • 内部作用域有权访问外部作用域;
  • 外部作用域无法访问内部作用域;(真是是这样吗?)
  • 兄弟作用域不可互相访问;

在《你不知道的Js》中,希望读者可以将作用域的嵌套和作用域链想象成这样:
90、JS作用域和作用域链

 (4)作用链举例

两段代码的结果都是"local scope",书中的回答是:JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。

var scope = "global scope";
function checkscope1(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f(); // 注意
}
checkscope1();
var scope = "global scope";
function checkscope2(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope2()();

上一篇:vue3.0设置图片列无显示问题,solt-scope报错


下一篇:monorepo之lerna