js 变量提升

想起来前段时间面试的时候遇到个问题,是关于变量提升的,记不得当时怎么答的了,今天再记一下

 

var k = 9;
function hoist(){
  k = 8;
  console.log(k);
}
hoist();
console.log(k);

 这里两次console.log输出k   结果是两次输出8,在hoist方法内部的 k 引用的是函数外部定义的 k , 不难理解

 

 

 

var k = 9;
function hoist(){
  var k = 8;
  console.log(k);
}
hoist();
console.log(k);

 这里两次输出 k , 结果是 8 和 9。hoist方法内部定义了局部变量并赋值8,全局变量k仍然是9。

 

 

var k = 9;
function hoist(){

  console.log(k);
  var k = 8;
  console.log(k);
}
hoist();
console.log(k);

 

这里hoist方法内部先输出 k ,然后定义局部变量,此时不要以为第一次的 k 是全局变量或者是后面的局部变量8。正确结果是undefined, 然后 是 8, 最后输出的是 9。

 

原因是javascript的变量声明具有hoisting机制。上面的代码相当于下面的代码

var k = 9;
function hoist(){
  var k;
  console.log(k);
  k = 8;
  console.log(k);
}
hoist();
console.log(k);

 这样就好理解多了。

 

其实就是相当于把变量定义提升到顶部,但是初始化过程不会被提升。

 

函数也有类似过程

function hoist(){
  inner();
  function inner(){
    console.log('inner');
  }
}
hoist();

 代码书写上调用inner的时候这个函数其实还没定义, 但是依然能正确调用,输出 ‘inner’

 

function hoist(){
  inner();
  var inner = function(){
    console.log('inner');
  }
}
hoist();

 这里采用函数表达式 的方法定义一个函数,这里提示 ‘inner is not a function’

 

这种情况可以参考变量提升。相当于以下代码

function hoist(){
  var inner;
  inner();
  inner = function(){
    console.log('inner');
  }
}
hoist();

 这样也就 好理解了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值