【JavaScript】——“重学前端”06JavaScript执行——闭包和执行上下文

闭包:

闭包其实只是一个绑定了执行环境的函数。

闭包与普通函数的区别是,它携带了执行的环境。

实际上 JavaScript 中跟闭包对应的概念就是“函数”。

 执行上下文:

JavaScript 标准把一段代码(包括函数),执行所需的所有信息定义为:“执行上下文”。

执行上下文在 ES2018 中包含这几个部分:

        lexical environment:词法环境,当获取变量或者 this 值时使用。
        variable environment:变量环境,当声明变量时使用
        code evaluation state:用于恢复代码执行位置。
        Function:执行的任务是函数时使用,表示正在被执行的函数。
        ScriptOrModule:执行的任务是脚本或者模块时使用,表示正在被执行的代码。
        Realm:使用的基础库和内置对象实例。
        Generator:仅生成器上下文有这个属性,表示当前生成器。

var 声明与赋值:

var b = 1

通常我们认为它声明了 b,并且为它赋值为 1,var 声明作用域函数执行的作用域。

也就是说,var 会穿透 for 、if 等语句。


在只有 var,没有 let 的旧 JavaScript 时代,诞生了一个技巧,叫做:立即执行的函数表达式(IIFE),通过创建一个函数,并且立即执行,来构造一个新的域,从而控制 var 的范围。

由于语法规定了 function 关键字开头是函数声明,所以要想让函数变成函数表达式,我们
必须得加点东西,最常见的做法是加括号

(function(){
     var a;
     //code
}());

(function(){
     var a;
     //code
})();

但是,括号有个缺点,那就是如果上一行代码不写分号,括号会被解释为上一行代码最末的函数调用,产生完全不符合预期,并且难以调试的行为,加号等运算符也有类似的问题。所以一些推荐不加分号的代码风格规范,会要求在括号前面加上分号。

;(function(){
 var a;
 //code
}())

;(function(){
 var a;
 //code
})()

推荐的写法是使用 void 关键字。也就是下面的这种形式。

void function(){
 var a;
 //code
}();

 let:

在 let 出现之前,JavaScript 的 if for 等语句皆不产生作用域。
以下语句会产生 let 使用的作用域:
for;
if;
switch;
try/catch/finally。

猜你喜欢

转载自blog.csdn.net/qq_50497708/article/details/128210984