你可能需要知道的前端小知识——JavaScript的全局机制

246 阅读2分钟

JavaScript的全局机制

预处理

  • JavaScript执行前,预处理var、函数声明、classconstlet这些语句
var
  • 预处理阶段,只关心当前作用域声明的变量,var的作用域能穿透所有语句结构,只认页面、模块和函数三种语法结构
  • 示例:页面声明变量,函数中声明同名变量,打印值为undefined
var a = 1;
function t() {
    console.log(a); //undefined
    var a = 2;
}
t();
  • 因为此时函数内有变量a,不会去访问外层作用域中的变量a,但是在打印变量的时候,变量还没有赋值,所以此时打印的值是undefined

  • 在示例1,在函数声明中,把console语句放到任何语句中,打印值依然是undefined。因为var的作用域能穿透所有语句结构

  • 正式因为var除了页面作用域和函数作用域之外都会穿透,因此在没有letconst的时代,会使用立即执行函数。

function
  • 声明表现和var相似,不同之处在于function在做预处理的时候除了在作用域中加入变量,还会赋值。
  • 示例:在声明前,打印函数,此时已经被赋值。
console.log(t); //f t(){}
function t(){
}
class
  • 全局行为和functionvar都不一样。
  • class的声明不会穿透if等语句结构,所以只有写在全局环境才有声明作用。
  • 遇到一些奇怪的用法,倾向于抛出错误。及早报错是好事,可以在开发阶段就发现代码可能的问题。

指令序言

  • use strictJavaScript标准中规定的唯一一种指令序言。
  • 使用指令序言可以指定JavaScript代码的一些特性。
  • 出现在脚本、模块和函数体的最前面。
  • 是一个字符串,单引号双引号都可以。

总结

  • 了解预处理,可以在代码中选择更适合的声明语句。
  • 指令序言让JavaScript和开发者有更多自定义的特性。
  • 欢迎评论留言。