当前位置: 首页 > Web前端 > JavaScript

学习笔记——JavaScript预编译

时间:2023-03-26 22:53:40 JavaScript

听了小野森美的预编译,收获颇丰,之前完全不懂。遇到这方面的面试题,头特别大。我只知道变量和函数会得到改进。这次终于学会了钓鱼的技巧,而不是鱼。不过现在var很少用了,const和let基本都用了,没那么好玩了,哈哈哈。当JavaScript执行脚本时,它会首先检查整个文本是否存在语法错误。有则报错,不继续执行;Declarationpromotion函数声明作为一个整体被提升,函数内部的代码不会被预编译。只有在上一步执行函数时,函数内部的代码才会被预编译。函数test被提升到最顶层,所以可以在声明函数之前调用test();functiontest(){console.log('test');}var声明的变量会被提升,只有变量名会被提升promoted,只有当赋值行运行时才会执行赋值,声明的变量会挂载在当前作用域内非var声明的变量是赋值语句。如果变量(函数声明或形参)在当前作用域内还没有声明过,则将window对象上var声明的变量a提升到最上面,值为undefined,当运行到赋值,它的值为100。变量b不会被提升,赋值前使用b会报错,赋值后不会。//console.log(a,b);console.log(a);vara=100;b=200;console.log(a,b);函数内部声明的变量b保存在当前作用域下,当前作用域下如果变量c还没有声明,则挂载在window对象上。函数测试(){varb=20;c=20}测试();控制台日志(c);通过形式参数在函数内部声明变量functiontest(c){varb=20;c=20console.log(c);//20}测试();控制台日志(c);//UncaughtReferenceError:cisnotdefined通过函数声明声明变量functiontest(c){varb=20;c=20函数c(){};控制台日志(c);//20}test();console.log(c);//UncaughtReferenceError:cisnotdefinedAOobject当函数执行到上一步时,JavaScript引擎会对函数进行预编译,并创建AO对象。ActivationObject也是函数上下文对象。具体流程函数test(a){console.log(a);//funcavara=1;控制台日志(一);//1个函数a(){};控制台日志(一);//变量b=函数(){};控制台日志(b);//funcb函数d(){};}test(100);第一步创建AO对象,是一个{};AO={}第二步找到形参和var变量声明AO={a:undefinedb:undefined}第三步赋值实参转形参AO={a:100b:undefined}第四步找到函数声明AO={a:functiona(){},b:undefined,d:functiond(){};}第五步,执行函数,忽略var声明和函数声明。遇到赋值语句时,会覆盖初始化值AO={a:functiona(){},b:function(){},d:functiond(){};}GO对象GO对象是全局对象全局上下文和AO对象类型。分析具体过程vara=100;functiona(){console.log(2);}第一步,创建GO对象GO={}第二部分,查找变量声明AO={a:undefined}第三步,寻找函数声明AO={a:functiona(){}}第四步,执行语句,遇到赋值语句,会覆盖初始化值面试题functiontest(a,b){console.log(a);//1c=0;变种C;一=5;b=6;控制台日志(b);//6函数b(){};函数d(){}console.log(b);//6}测试(1);具体过程GO={test:functiontest(){},}//测试函数执行//查找形参和变量声明AO={a:undefined,b:undefined,c:undefined,}//实参赋值给形参AO={a:1,b:undefined,c:undefined,}//找到函数声明AO={a:1,b:functionb(){},c:undefined,d:functiond(){},}//执行代码,赋值