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

JS面试题一:预编译——变量提升和函数提升

时间:2023-03-27 16:35:24 JavaScript

一是什么?总结:简单来说,引擎会在js代码执行之前进行预编译。在预编译期间,变量声明和函数声明将被提升到它们对应范围的顶部。变量提升:声明在全局作用域的变量会提升到全局作用域的最顶层,声明在函数中的变量只会提升到函数作用域的最顶层。functionvariableUp(){if(!foo){varfoo=5;}console.log(foo);//5}变量更新();函数提升:函数提升只提升函数声明,不提升函数表达式,定义一个形参相当于在函数作用域声明一个变量functionfunUp(a){conosle.log(a)//output:undefinedfunctionfoo(){控制台日志(1);}foo();//输出:2functionfoo(){console.log(2);}}funUp()varfunUp=function(){console.log(funUp)}JavaScript中的函数是一等公民,函数声明的优先级最高,会被提升到当前作用域的顶部2。变量提升和函数提升的理解3.练习实例题目:functionfn(a,c){console.log(a)//output:functiona(){}vara=123console.log(a)//output:123console.log(c)//输出:functionc(){}functiona(){}if(false){vard=678}console.log(d)//输出:undefinedconsole.log(b)//output:undefinedvarb=function(){}console.log(b)//output:functionfunctionc(){}console.log(c)//output:functionc}fn(1,2)分析:oa={a:undefined,//1,function,123c:undefined,//2,functiond:undefined,b:undefined,//function}不管js中的哪种形式声明(var,let,const,function,function,class)会有升迁现象。不同的是,(var,function,function)声明在提升时会被初始化并赋值为undefined,所以访问这些变量时不会报ReferenceError。用let,const,class声明的变量在被提升后不会被初始化。这时候如果访问这些变量,就会抛出ReferenceError异常,看起来就像没有被提升一样。结论:无论是早期代码还是ES6中的代码,我们都需要遵循一点,先声明,后使用