我可能学了个假的ES5吧

282 阅读2分钟

今天第一次听说词法环境。。。
第一次听,这是什么鬼?我就呵呵呵。
以前,就听过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。
类似题目很多,我觉得还是需要处处留意,不然,真的会像我一样连一些专业术语听都没听过。