Js基础_var,let,const(预解析)


导读

// 1.
// console.log(num) // ReferenceError: num is not defined
//原因:num变量未定义

// 2.
console.log(num)//undefined
var num = 10
//原因:var 会进行声明提升,声明会提到前面,但是赋值还是会在原来的位置

// 3.
fn()//10
function fn(){
  console.log(10)
}
// 函数被调用执行

// 4.
fun()//TypeError: fun is not a function
var fun = function(){
  console.log(10)
}
// 原因,fun是一个变量,var会进行声明提升,将var fun提升之后,fun是一个空的变量,并不是一个函数

一、预解析

js解释器执行代码的时候分为两步:
1.预解析:

js引擎会把js里面的var和function提升到作用域的最前面

2.执行代码:

按书写顺序从上往下执行代码

1.预解析

声明提升

把所有var的变量声明提升到当前作用域的最前面,不提供赋值操作,具体可参考Js基础_作用域中的var,let,const区别

console.log(num)//undefined
var num = 10
//原因:var 会进行声明提升,声明会提到前面,但是赋值还是会在原来的位置

函数提升

函数提升就是把所有函数声明提升到作用域的最前面,不调用函数

2.babel编译

这是很多初学者都没有去关注的一个点

编译前:

这里我们是将会必定报错的注释了,在后面我会取消注释进行编译

//1.var定义变量的fori循环
for (var i = 0; i < 3; i++) {
  console.log(i)
}

//2.let定义变量的fori循环
for (let i = 0; i < 3; i++) {
  console.log(i)
}

//3.var
console.log(varValue)// undefined
var varValue = '我是var'
varValue = 'var'
console.log(varValue)

//4.let
// console.log(letValue)// 报错 无法在初始化之前访问
let letValue = '我是let'
letValue = 'let'
console.log(letValue)// 报错

//5.cont
// console.log(constValue)// 报错 无法在初始化之前访问
const constValue = '我是cont'
// constValue = 'cont' //报错 const声明的变量值不难被更改
console.log(constValue)

执行结果:
在这里插入图片描述

编译后:

这里编译的是取消注释的版本

//1.var定义变量的fori循环
for (var i = 0; i < 3; i++) {
    console.log(i);
}
//2.let定义变量的fori循环
for (var i_1 = 0; i_1 < 3; i_1++) {
    console.log(i_1);
}
//3.var
console.log(varValue); // undefined
var varValue = '我是var';
varValue = 'var';
console.log(varValue);
//4.let
console.log(letValue); // 报错 无法在初始化之前访问
var letValue = '我是let';
letValue = 'let';
console.log(letValue); // 报错
//5.cont
console.log(constValue); // 报错 无法在初始化之前访问
var constValue = '我是cont';
constValue = 'cont'; //报错 const声明的变量值不难被更改
console.log(constValue);
//# sourceMappingURL=test.js.map

执行结果:
在这里插入图片描述

二、案例

案例1

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

输出:undefined
//这个案例涉及到了作用域和预解析的知识点

案例2

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

输出:
undefined
20

案例3

var a = 10
function fn(){
  var b =9
  console.log(a)
  console.log(b)
  var a ='23'
}
fn()

输出:
undefined
9

案例4

fn()
console.log(c)
console.log(b)
console.log(a)
function fn() {
  // b和c是直接赋值,没有var声明,当全局变量来看
  // 只有a被声明了
  var a = b = c = 9;
  console.log(a)
  console.log(b)
  console.log(c)
}

输出:
9
9
9
9
9
ReferenceError: a is not defined
// a不是全局变量,只有在fn函数中有作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是发财不是旺财

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

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

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

打赏作者

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

抵扣说明:

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

余额充值