我可能学了个假的ES5吧

简介: 语法环境的分类

今天第一次听说词法环境。。。

第一次听,这是什么鬼?我就呵呵呵。

以前,就听过js有闭包、原型链、作用域链。。。Emmm今天又get到了一个新的知识点。


词法环境就词法环境吧,别小瞧。嘿!它还有分类。


  1. 全局词法环境

   说白了他就是window这个爸爸啊。先来看道题目:


console.log(a)
var a = 1


看到题目,大家估计就大概知道,其实最先学习的时候就遇到过,只是大家不注意吧。基本功 不扎实的可能就会认为输出1。其实不然,答案是undefined。没想到吧。

用全局词法环境解释,就说得通了。

全局词法环境先是预处理阶段,先记录所在作用域代码中声明的变量,不包含没有var声明的变量。在此就是全局作用域,记录var a

代码执行阶段,执行console.log(a),a未赋值,所以输出就是undefined哦。


2. 函数词法环境


首先预处理阶段,记录函数的参数到词法环境,并赋值。 其次到执行阶段,给预处理中的变量赋值,将没有var声明的变量记录到全局词法环境,并赋值。


function f(a,b){
  console.log(a)
  var  a = 100
}
f(10,5)


不卖关子了,输出是10。在函数词法环境中,记录a,但并未赋值。当执行阶段时,f将a参数赋值未10,参数a和变量a重名并覆盖,此事a的值为10。所以输出为10。

在此,我只是列举了两个比较简单的例子,复杂一点的可能就会产生每一行我都读得懂,凑一起谁也不认识谁。看一下这题:


console.log(a)
console.log(b)
console.log(c)
console.log(d)
var  a = 1;
If(false)
     var  b = 2;
else
     c = 3
function f(){
  var d = 4
}


a输出为undefined我想不需过多解释。先用全局词法环境,记录b(a忽略,d是函数内不属于全局),SO,输出为undefined。c未定义,所以输出就是c is not defined。d在函数f内,全局无法找到d,并且f函数并未执行,所以d和c一样,也是d is not defined。

类似题目很多,我觉得还是需要处处留意,不然,真的会像我一样连一些专业术语听都没听过。


作者:ClyingDeng

链接:https://juejin.cn/post/6844903945886760973

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

目录
相关文章
|
2月前
ES6扩展运算符和剩余参数运算符
该文章讲解了ES6中扩展运算符和剩余参数运算符的用法,包括展开数组、浅拷贝、将伪数组转换为真数组,以及如何将函数调用时的参数收集到一个数组中。
32 3
|
6月前
|
存储 安全 JavaScript
ES6学习之数值
ES6学习之数值
|
JavaScript
js判断undefined, 判断null, 判断NaN
js判断undefined, 判断null, 判断NaN
|
JavaScript
es6数据类型Symbol以及es6操作数组常用的方法
es6数据类型Symbol以及es6操作数组常用的方法
88 0
es6:空值合并运算符
es6:空值合并运算符
115 0
es6:空值合并运算符
nullish(空值合并)运算符
nullish(空值合并)运算符
288 1
|
JavaScript
TS中的条件类型(ReturnType)
本偏介绍TS另一种高级类型-条件类型
267 0
|
JavaScript
TS类型推论
TS类型推论
94 0
|
存储 JavaScript 前端开发
ES2020 系列:空值合并运算符 '??'
ES2020 系列:空值合并运算符 '??'
291 0
ES2020 系列:空值合并运算符 '??'
|
Shell Linux
Shell运算符、$((运算式))” 或 “$[运算式]、expr方法、条件判断、test condition、[ condition ]、两个整数之间比较、按照文件权限进行判断、按照文件类型进行判断
Shell运算符、$((运算式))” 或 “$[运算式]、expr方法、条件判断、test condition、[ condition ]、两个整数之间比较、按照文件权限进行判断、按照文件类型进行判断
Shell运算符、$((运算式))” 或 “$[运算式]、expr方法、条件判断、test condition、[ condition ]、两个整数之间比较、按照文件权限进行判断、按照文件类型进行判断