js中的作用域以及代码的预解析

作用域

全局作用域和局部作用域

全局作用域:整个script标签中的区域
局部作用域:函数内部的区域,代码只在函数内部起效果

全局变量和局部变量

全局变量:在全局都可以使用,在全局作用域下声明的变量或者在函数内部未声明直接使用(不推荐使用)的变量成称为全局变量
局部变量:只能在函数内部使用;在函数内部声明的变量叫局部变量;函数的形参实际上也是局部变量

注意:当前的js中是没有块级作用域的。块级作用域:被花括号’{}‘包含的区域

作用域链

根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链。
在作用域链的案例中,实际上也就是就近原则;
接下来我们看一个案例:

function f1() {
	 var num = 123;
	 function f2() {
	     console.log(num);
	 }
	 f2();
}
var num = 456;
f1()

该代码的输出结果为123;
我们可以看到输出的是离它最近的一个值;实际上这个过程就是一个向外部查询值的过程。
再看一个案例:

var a=1;
function fn1(){
   var a=2;
   var b='22';
   fn2;
   function fn2(){
       var a=3;
       fn3();
       function fn3(){
           var a=4;
           console.log(a);
           console.log(b);
       }
   }
}
fn1;

这个代码a的结果为4,b的结果为’22’;
我们可以看到,相当于是从输出的时候依次往外找,照道离他最近的那个值。
但在这里,我们要注意一件事,函数只有在调用的时候才会执行,所以做这种题时记得避免踩坑。

预解析

js引擎运行js时分为两步:预解析 代码执行
预解析:js引擎会把js里面所有的var和function提升到当前作用域的最前面
代码执行:按照代码书写的格式从上往下执行

变量预解析

将所有变量声明提升到当前作用域的最前面,不提升赋值操作

函数预解析

将所有函数声明提升到当前作用域的最前面,不调用函数

案例

预解析是在面试时经常会遇到的考点,这里我们给出几个案例练习一下。
案例一

var num=10;
fun();
function fun(){
    console.log(num);
    var num=20;
}

输出结果

undefined

这里我们可以看到,函数内部会将var num提升到函数的最上面,但此时并没有赋值,所以会输出undefined。
案例二(一道经典的面试题)

f1()
console.log(c);
console.log(b);
console.log(a);
function f1() {
    var a = b = c = 9;
    console.log(a);
    console.log(b);
    console.log(c);
}

输出结果

9
9
9
9
9
出错

这里的var a=b=c=9就相当于是var a=9;b=9;c=9;前面我们提到了在函数中未声明的变量为全局变量,所以在预解析时会把他们提升到最上面。所以结果就显而易见了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漠–

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值