关于JavaScript中变量和函数的提升

  • 在我们正常的工作中很少会遇到这种关于变量、函数的提升问题,但是在我们面试的时候都喜欢问的,真不知道面试官怎么想的,而我们这些菜鸟往往就会在这里出现问题。
  • 废话不多说,开始正文
  • 首先我们都知道再执行js文件时,会分为两部,编译和执行,变量、函数的提升就在编译的时候完成的
  • 记住要点:
  • ***提升的是变量名而不是变量值
  • ***变量的提升只会对var 声明的变量进行提升
  • 1.关于变量的提升
  • 类似于 a = 1;的这种编译的时候就会写成
var a;
a = 1
  • 2.关于函数的提升
  • 分为 函数声明式 和 函数字面量式
  • 函数字面量的提升与变量的提升是一样的,顺序的话就是看谁前谁后了
  • 函数声明式的提升就不一样了,函数声明式的优先级高于变量的优先级。也就是在提升时,函数声明式 总是在 变量 的前面的——(后半句错误!!!)

下面看具体的例子
1.先看变量的提升

console.log(a)      //结果为:a is not defined  报错了
b = 1;
console.log(b)    //结果为:1
var c = 2;
console.log(c)    //结果为:2

实际以上代码会编译为下面的,然后再从上向下执行

var b;
var c;
console.log(a);
b = 1;
console.log(b);
var c = 2;
console.log(c) 

2.函数的提升(函数声明式)

console.log(aa);             //结果为  undefined
console.log(bb);             // 这个将会报错  bb is not defined 变量的提升只会对var声明的变量进行提升,所以就未定义呗!
bb = 10
var aa = 100;
function fn() {
    console.log(aa);         //结果为  undefined
    var aa = 200;
    console.log(aa);		 //结果为 200
}
fn();
console.log(aa)            //结果为  100

实际以上代码会编译为下面的,然后再从上向下执行

var aa;
function fn() {
	var aa;
	console.log("函数内部的 "+aa);           //第二结果   函数内部的 undefined
	aa = 200;
	console.log("函数内部的 "+aa)			   //第三个结果   函数内部的 200
}
console.log("变量 "+aa)                              //第一个结果  变量 undefined
console.log(bb)
bb = 10
aa =100
fn()
console.log("变量 "+aa)						//第四个结果  变量 100

当然上面的bb报错了执行不了,测试的时候得注释掉

3.函数的提升(函数字面量式)

fn1();                                          //报错了   fn1 is not a function
var fn1=function (){
	console.log(1)
}

实际以上代码会编译为下面的,然后再从上向下执行

var fn1;
fn1();                                           //很明显fn1是一个未赋值的变量,并不能用调用函数的方式调用
fn1 = function(){
	console.log(1)
}

纠正一个错误:
就是函数提升的优先级比变量提升的优先级高,这句话对着呢,但是他们两之间是变量先提升,函数后提升。那么关于他们的优先级说的是,提升的时间,函数提升的时间比变量提升的时间晚,后执行,所以说是函数提升的优先级高于变量。看下面的列子

function a(){
}
var a;
console.log(typeof a)                 //结果是  function

如果是函数先提升的话,输出的应该是 undefined

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值