JavaScript中的变量作用域和提升之前看过一些相应的文章,但是对变量作用域和提升的理解不够透彻,今天就来说说吧。首先要知道,在ES6之前,JS中只有函数作用域。let和const等变量声明关键字以及块级作用域是ES6独有的。我们先来看一下作用域的定义:作用域是指代码执行过程中变量、函数或对象可访问的区域。最简单的例子是函数内定义的变量在函数外无法访问varname1='name1';functionlogName(){varname2='name2'console.log(name2)}logName()console.log(name1)安慰。log(name2)在执行console.log(name2)的时候会报错,说name2没有定义块级作用域。举个简单的例子leta=1{letb=3a=2}console.log(a)console.log(b)}test()上面代码执行的时候也会报错说b变量未定义。作用域解释起来比较简单。毕竟场景不多,简单列举一些。如果提升了变量,则必须仔细查看相同的内容。首先,让我们看几个例子。有兴趣的可以先自己尝试对应的执行过程。//1functiontest(){console.log(a);//未定义vara=123;};test()实际函数测试(){vara;控制台日志(一);a=123;}测试();这意味着使用var声明的变量将被提升到范围的顶部//第二部分示例console.log(v1);varv1=100;functionfoo(){console.log(v1);变量v1=200;console.log(v1);}foo();console.log(v1);这就涉及到另外一个知识点:变量的最近查找。上面代码中,在foo函数中也定义了v1,所以foo函数中的实际顺序就是这个functionfoo(){varv1console.log(v1);v1=200;console.log(v1);}咳咳,只是提升了定义,分配的代码不变。另外,如果在函数外定义,使用了var关键字,就会绑定到global上,成为全局变量。//例3vara=1functiontest(a){console.log(a)vara=11console.log(a)}test(a)如果传入的形参与外部变量名相同,则priorityis这个是等价的,因为在JS中,函数执行时,形参和局部变量都保存在一个活动对象,也就是变量对象中。如果在局部变量中定义了与形参同名的变量,编译器会忽略这个定义,所有对该变量的操作都会反映到形参的变量中。
