03.06 「前端架构师30天快速掌握js16」之作用域知识点详解

此篇文章讲解目录:

  • 作用域详解

  • 基本的变量作用域

  • “无块级作用域”的理解

  • 作用域链

作用域的详解

在深入学习JavaScript作用域之前,首先要了解一下,究竟什么是作用域。几乎所有的编程语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。

我们先了解一下JavaScript的工作原理,引擎,编译器,作用域三者是如何协同工作来完成javascript代码的执行的。

引擎:从头到尾负责整个JavaScript程序的编译及执行过程。

编译器:负责词法分析及代码生成

作用域:负责收集并维护由所有声明的变量组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些变量的访问权限。

基本的变量作用域

「前端架构师30天快速掌握js16」之作用域知识点详解

上面的例子中,声明了全局变量 scope 和函数体内的局部变量 scope。在函数体内部,局部变量的优先级比通明的全局变量要高,如果一个局部变量的名字与一个全局变量相同,那么,在声明局部变量的函数体范围内,局部变量将覆盖同名的全局变量。

「前端架构师30天快速掌握js16」之作用域知识点详解

在上面的例子中,为什么函数体外面的scope也变成了local呢,这是因为javascript的特性造成的。在全局作用域中声明变量可以省略 var 关键字,但是如果在函数体内声明变量时不使用 var 关键字,就会发生上面的现象。首先,函数体内的第一行语句,把全局变量中的 scope 变量的值改变了。而在声明 myScope 变量时,由于没有使用 var 关键字,Javascript 就会在全局范围内声明这个变量。因此,在声明局部变量时使用 var 关键字是个很好的习惯。

“无块级作用域”

在 C 或者 Java 等语言中,if、for 等语句块内可以包含自己的局部变量,这些变量的作用域是这些语句的语句块,而在 Javascript 中,不存在「块级作用域」的说法。

「前端架构师30天快速掌握js16」之作用域知识点详解

在上面的例子中,无论在函数的if或者for语句内外,i k j这些变量都可以正常输出,说明:函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有定义的,即使是在声明之前

作用域链

由于JavaScript中的每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。

「前端架构师30天快速掌握js16」之作用域知识点详解

上述代码中,当执行console.log(xo)时,其寻找顺序为根据作用域链从内到外的优先级寻找,如果内层没有就逐步向上找,直到没找到抛出异常。

「前端架构师30天快速掌握js16」之作用域知识点详解

下面这张图,则更加形象的说明了作用域链的解释:

「前端架构师30天快速掌握js16」之作用域知识点详解

大家好接下来我们会邀请前端架构师以连载的方式,通过30天的实战系统讲解JavaScript的专业知识,欢迎大家关注头条号“互联网IT信息”。


分享到:


相關文章: