今天第一次听说词法环境。。。
第一次听,这是什么鬼?我就呵呵呵。
以前,就听过js有闭包、原型链、作用域链。。。Emmm今天又get到了一个新的知识点。
词法环境就词法环境吧,别小瞧。嘿!它还有分类。
- 全局词法环境
说白了他就是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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。