【JavaScript】Js预解析 变量提升 & 函数提升问题

1. 预解析

JavaScript代码是由浏览器中的JavaScript解析器来执行的。

JavaScript代码的时候分为两步:预解析 、 代码执行。

预解析:Js 解释器会把JavaScript里面所有的var还有function提升到当前作用域的最前面。

预解析分为变量预解析(变量提升)和函数预解析(函数提升)

代码执行:按照代码书写的顺序从上往下执行。

2. 变量提升

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

eg:变量 

console.log(num); //undefined
var num = 13;
 
// 相当于执行了以下代码
var num;
console.log(num); //undefined
num = 13;


eg2:函数 

fu (); // Error 报错
var fu = function() {
    console.log('Good');
}
 
// 相当于执行了以下代码
var fu ;
fu (); // Error 报错
fu = function() {
    console.log('Good');
}

以上代码中,相当于先执行了变量声明func为一个变量,并没有声明func()函数,所以结果会报错。

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

// 函数提升
func(); // hello world`

function func() {
    console.log('hello world`');
}
 
// 相当于执行了以下代码
function func() {
    console.log('hello world`');
}
func(); // hello world`


eg 4 案例 


var num = 10;
fun();
 
function fun() {
    console.log(num); // undefined
    var num = 20;
}
 
// 相当于执行了以下代码
var num;
 
function fun() {
    var num;
    console.log(num); // undefined
    num = 20;
}
num = 10;
fun();

第二题:

//example 1
function f1() {
    var a = b = c = 9;
    //相当于 var a = 9; b = 9; c = 9;  b 和 c 直接复制,没有var 是全局变量
    //如果是集体声明: var a = 9, b = 9, c = 9; 则a b c都为局部变量
    console.log(a); //9
    console.log(b); //9
    console.log(c); //9
 
}
f1();
 
console.log(b); //9
console.log(c); //9
console.log(a); //Error
 
// 相当于执行了以下代码
function f1() {
    var a;
    a = b = c = 9;
    //相当于 var a = 9; b = 9; c = 9;  b 和 c 直接复制,没有var 是全局变量
    //如果是集体声明: var a = 9, b = 9, c = 9; 则a b c都为局部变量
    console.log(a); //9
    console.log(b); //9
    console.log(c); //9
 
}
f1();
 
console.log(b); //9
console.log(c); //9
console.log(a); //Error  a是局部变量,在函数作用域外调用会报错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值