-
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
-
回顾: 你可能需要知道的前端小知识——JavaScript语句执行—
- 之前分析执行的时候忽略了预处理,这篇文章着重分析语句的预处理
JavaScript的全局机制
预处理
JavaScript执行前,预处理var、函数声明、class、const和let这些语句
var
- 预处理阶段,只关心当前作用域声明的变量,
var的作用域能穿透所有语句结构,只认页面、模块和函数三种语法结构 - 示例:页面声明变量,函数中声明同名变量,打印值为
undefined。
var a = 1;
function t() {
console.log(a); //undefined
var a = 2;
}
t();
-
因为此时函数内有变量
a,不会去访问外层作用域中的变量a,但是在打印变量的时候,变量还没有赋值,所以此时打印的值是undefined。 -
在示例1,在函数声明中,把
console语句放到任何语句中,打印值依然是undefined。因为var的作用域能穿透所有语句结构 -
正式因为
var除了页面作用域和函数作用域之外都会穿透,因此在没有let和const的时代,会使用立即执行函数。
function
- 声明表现和
var相似,不同之处在于function在做预处理的时候除了在作用域中加入变量,还会赋值。 - 示例:在声明前,打印函数,此时已经被赋值。
console.log(t); //f t(){}
function t(){
}
class
- 全局行为和
function、var都不一样。 class的声明不会穿透if等语句结构,所以只有写在全局环境才有声明作用。- 遇到一些奇怪的用法,倾向于抛出错误。及早报错是好事,可以在开发阶段就发现代码可能的问题。
指令序言
use strict:JavaScript标准中规定的唯一一种指令序言。- 使用指令序言可以指定
JavaScript代码的一些特性。 - 出现在脚本、模块和函数体的最前面。
- 是一个字符串,单引号双引号都可以。
总结
- 了解预处理,可以在代码中选择更适合的声明语句。
- 指令序言让
JavaScript和开发者有更多自定义的特性。 - 欢迎评论留言。