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

不仅变量可以“挂”,函数声明也可以,那么谁更“挂”呢?

时间:2023-03-28 16:46:04 HTML

MindMapReviewScope在编译的代码生成阶段,编译器会在对应的scope中创建变量,将两者关联起来。大家声明var声明的变量会被“变量提升”的说法并不稀奇,但我还是写在这里。a=2;vara;console.log(a);//2console.log(a);//未定义变量a=2;var声明的变量会进行“变量提升”上面的代码会变成这样vara;a=2;console.log(a);//2vara;//声明未分配的默认值为undefinedconsole.log(a);//未定义a=2;编译器第一次“动手”总结:变量和函数中的所有声明在任何代码执行之前都会被首先处理。vara=2;console.log(a);//2上面的代码可以看到vara;//编译器声明(首先,无论在源代码的哪个位置)a=2;//代码执行赋值控制台。日志(一);//2函数提升总结:函数声明会提升,函数表达式不会提升。foo();functionfoo(){console.log(a);//undefinedvara=2;}上面的代码可以这样写functionfoo(){vara;控制台日志(一);//未定义a=2;}foo();不需要提升函数表达式。函数表达式是将一个函数赋值给一个变量。既然都是任务,自然不会晋升,只会晋升宣告。即使使用命名函数表达式,命名标识符也不能在封闭范围内使用,直到它们被赋值。富();//这里的TypeErrorfoo是默认值undefined(var的原因)bar();//ReferenceErrorvarfoo=functionbar(){console.log(a);//undefinedvara=2;}functiontakesprecedence函数声明和变量声明都被提升。但是函数将首先被提升,然后是变量foo();//1varfoo;functionfoo(){console.log(1);}foo=function(){console.log(2);};上面的代码foo()是1而不是TypeError。所以函数声明优先于变量声明。富();//类型错误:foo不是函数functionfoo(){console.log(2);};varfoo;//忽略的函数声明仍然可以覆盖foo();//3functionfoo(){console.log(1);}varfoo=function(){console.log(2);};functionfoo(){console.log(3);}摘要语句本身被提升,包括函数表达式里面的赋值操作的赋值都没有提升。