javascript var/function 变量提升

本文深入解析JavaScript中的变量提升(hoisting)现象,包括var、let声明的区别,以及function声明的提升机制。通过具体示例说明如何避免常见陷阱。

前言

在javascript中,var、function会变量提升(hoisting);var声明,会在任何code执行前,将变量提升到所在作用域的最高处。function声明,在编译阶段加载到内存,所以在var声明之前就会执行。

var提升

var声明会在任何代码执行之前,提升到所在作用域的最高处

console.log(x) //undefined
var x = 1;

相当于

var x;//
console.log(x) //只声明,未初始化,所以输出undefined 
x = 1;

理解了这个特性,那么下边引用函数内的循环变量也就明白了。

function f(){
	for(var i=0; i<3; i++){

	}
	console.log(i) //3
}
f()

等同于

function f(){
	var i;
	for(i=0; i<3; i++){

	}
	console.log(i)
}
f()

通常方式声明,不会变量提升

如果不使用var,而是通常方式声明,则不会变量提升,只有执行到所在行,才会声明为全局变量

console.log(x) //ReferenceError: x is not defined
x = 1 //通常方式的声明变量不会变量提升

要防止var提升,可以使用let,let声明了块级作用域,不会有变量提升

let没有变量提升

执行到所在行,才会声明

console.log(x) //ReferenceError: x is not defined
let x = 1 

let声明了块级作用域

{
let x = 1 
}
console.log(x) //ReferenceError: x is not defined
function f(){
	
	for(let i=0; i<3; i++){

	}
	console.log(i)//ReferenceError: i is not defined
}
f()

function 提升

function 声明,在js编译阶段就会加载到内存,在var提升、任何代码执行之前,执行。这意味着,可以先调用函数,后声明函数,但function expression不具有此特性,function expression只有执行到所在行,才会执行。

f();
function f(){
	console.log("f()");//输出f()
}

function 声明提升到任何代码、var声明之前

f();
function f(){
	console.log("function()");
}
var f = 4
console.log(f)

输出

function()
4

总结

在javascript中,var、function会变量提升(hoisting);var声明,会在任何code执行前,将变量提升到所在作用域的最高处。function声明,在编译阶段加载到内存,所以在var声明之前就会执行。

9年全栈开发经验,请关注个人公众号

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值