首页 > 编程知识 正文

js如何定义一个变量,vue的性能优化

时间:2023-05-05 02:50:14 阅读:14920 作者:4839

var,未定义,letvarconsole.log(a ) var a=10的结果:

原因:可以看到,上面的代码在编译阶段是下面的代码,var a=10是编译阶段用声明变量: var a,变量赋值: a=10的两个语句。 声明变量位于当前范围(全局范围)的开头,赋值变量的语句保留在该位置。 变量a仅在输出前声明而未定义,因此输出的是undefined而不是错误报告,不输出10个。

未定义varaconsole.log(a ) a=10console.log ) a=10的结果:

原因:未用var关键字定义的全局变量没有预编译过程,因此将变量的使用放在定义之前会报告错误

如果在声明变量时不使用var关键字,则变量始终是全局变量。 到那时为止,调用时有以下区别。

时间声明位于方法之外的全局变量可以直接在方法中使用; 如果全局变量是在方法中声明的,则在方法外使用该变量时,必须调用该方法以通知系统该全局变量已声明。

如果降低a的顺序,则可以执行正确的a=10console.log(a )

let控制台. log (a ) let a=10

原因: let/const不会引起变量的等级上升。 在分析代码时,JavaScript引擎也会注意出现在块后面的let声明。 但是,在此之前并不饿,可以参照未通过任何方法声明的变量。 在let声明之前执行的瞬间称为“临时死区”(temporal dead zone ),如果引用稍后在此阶段声明的变量,则会抛出ReferenceError错误。 (JavaScript高级编程第4版P26 )

需要注意的是,let和const不仅不升级变量,而且将变量绑定到块范围。 例如

if (真) { let a=10; }console.log(a )//报告错误,形成分块范围

用let宣言的变量在无变量的情况下上升,形成if{}块范围。 范围无法访问a的值

词法范围vara=10 function foo ((console.log ) a ) foo (a )/foo执行全局范围输出10function foo2) { var a=100 foo }/foo执行foo

函数不报告错误,而是提高foo(functionfoo ) (console.log )1) /输出1进行编译后

function foo () console.log ) ) foo )函数整体提升

但是需要注意的是下面的例子

foo(varfoo=function ) console.log ) )1)//错误报告: uncaught typeerror : fooisnotafunction编译后

varfoofoo(foo=function ) console.log ) )的一部分将函数代入一个变量,所以不会引起函数的级别上升,与变量的级别上升规则类似

/函数优先foo(functionfoo ) console.log )1) /输出1 )在重复声明varfoo的示例中,变量foo被声明为两次,一次声明为函数,一次声明为未定义的变量。 另外,如果两个声明都在全局范围下,在同一范围下,变量名称和函数名称相同(重复声明),则执行函数优先原则并忽略变量。

所以实际编译的是这样的

function foo () console.log ) )1) }//var foo函数优先原则。 此语句在编译时为foo ) )//输出1的总结编译阶段确定范围,如果变量上升,则变量上升,但变量赋值保留在原地,let/const不发生变量上升,也发生变量上升

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。