diff --git "a/08\345\273\226\346\237\217\346\210\220/\347\254\224\350\256\260/2022-10-28\351\242\204\347\274\226\350\257\221.txt" "b/08\345\273\226\346\237\217\346\210\220/\347\254\224\350\256\260/2022-10-28\351\242\204\347\274\226\350\257\221.txt" new file mode 100644 index 0000000000000000000000000000000000000000..d8ed33286d63d54e6680ee2465b0db7c465360d6 --- /dev/null +++ "b/08\345\273\226\346\237\217\346\210\220/\347\254\224\350\256\260/2022-10-28\351\242\204\347\274\226\350\257\221.txt" @@ -0,0 +1,115 @@ +预编译步骤 +首先JavaScript的执行过程会先扫描一下整体语法语句, +如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话, +开始从上到下解释一行执行一行。 + + + +局部预编译的4个步骤: + +创建AO对象(Activation Object)执行期上下文。 +找形参和变量声明,将变量和形参名作为AO属性名,值为undefined +将实参值和形参统一。 +在函数体里面找函数声明,值赋予函数体。 + + +全局预编译的3个步骤: + +创建GO对象(Global Object)全局对象。 +找变量声明,将变量名作为GO属性名,值为undefined +查找函数声明,作为GO属性,值赋予函数体 +由于全局中没有参数的的概念,所以省去了实参形参相统一这一步。 + + + +tip:GO对象是全局预编译,所以它优先于AO对象所创建和执行 + +关于AO对象的例子 + +// 函数 +function fn(a){ + console.log(a); + // 变量声明+变量赋值(只提升变量声明,不提升变量赋值) + var a = 123; + console.log(a); + // 函数声明 + function a(){}; + console.log(a); + // 函数表达式 + var b = function(){}; + console.log(b); + // 函数 + function d(){}; +} +//调用函数 +fn(1); + + +1.预编译第1步:创建AO对象 + +AO{ + +} +2.预编译第2步:找形参和变量声明,将形参名和变量名作为AO对象的属性名 + +AO{ + a : undefined, + b : undefined +} +3.预编译第3步:将实参值和形参统一 + +AO{ + a : 1, + b : function(){...} +} +4.预编译第4步:在函数体里面找函数声明,值赋予函数体。 + +AO{ + a : function a(){...}, + b : undefined, + d : function d(){...} +} +最后输出结果: + +// 函数 +function fn(a){ + console.log(a); //根据AO对象中的数据第一个打印的是:fn() + // 变量声明+变量赋值(只提升变量声明,不提升变量赋值) + var a = 123; // 执行到这时,由于变量赋值是不提升的,所以函数被123覆盖了 + console.log(a); // 123 + // 函数声明 + function a(){}; // 这里被提升上去了,可以忽略 + console.log(a); // 123 + // 函数表达式 + var b = function(){}; + console.log(b); // 根据AO对象中的数据:fn() + // 函数 + function d(){}; +} +//调用函数 +fn(1); +函数执行完毕,销毁AO对象。 + + + +1.全局预编译第1步:创建GO对象 +2.全局预编译第2步:找变量声明,将变量名作为GO属性名,值为undefined +3.全局预编译第3步:查找函数声明,作为GO属性,值赋予函数体 +4.局部预编译第1步:创建AO对象 +5.局部预编译第2步:找形参和变量声明,将形参名和变量名作为AO对象的属性名 +6.局部预编译第3步:将实参值和形参统一(此函数没有形参) +7.局部预编译第4步:在函数体里面找函数声明,值赋予函数体。(此函数内没有函数声明) + + + +页面产生便创建GO全局对象(Global Object)(也就是window对象); +第一个脚本文件加载; +脚本加载完毕后,分析语法是否合法; +开始预编译 +查找变量声明,作为GO属性,值赋予undefined; +查找函数声明,作为GO属性,值赋予函数体; +在预编译过程中,变量声明出现同名不覆盖,变量声明与函数声明同名,变量声明不能覆盖函数声明,函数声明直接覆盖变量声明,值为函数体。 +全局预编译结束后,GO中存储的值 + +tip:关于GO对象和AO对象,它们俩是一个种链式关系,就拿上面的这个例子来说吧,如果在函数体的内部没有定义global变量, +这也意味着AO对象中将有这个global这个属性。那如果没有会怎么办?它会去GO对象中寻找,说白了也就是一种就近原则。 \ No newline at end of file diff --git "a/08\345\273\226\346\237\217\346\210\220/\347\254\224\350\256\260/2022-10-31\351\227\255\345\214\205 .txt" "b/08\345\273\226\346\237\217\346\210\220/\347\254\224\350\256\260/2022-10-31\351\227\255\345\214\205 .txt" new file mode 100644 index 0000000000000000000000000000000000000000..e31eae6b1297b9343492fcbf531acd1360781b36 --- /dev/null +++ "b/08\345\273\226\346\237\217\346\210\220/\347\254\224\350\256\260/2022-10-31\351\227\255\345\214\205 .txt" @@ -0,0 +1,11 @@ +闭包(closure) +是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。 +换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。 +在 JavaScript 中,闭包会随着函数的创建而被同时创建。 + + +闭包很有用,因为它允许将函数与其所操作的某些数据(环境)关联起来。这显然类似于面向对象编程。在面向对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。 + +因此,通常你使用只有一个方法的对象的地方,都可以使用闭包。 + +如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。 \ No newline at end of file