javascript中,声明变量和函数的时候加var和不加var的区别

变量

在开发过程中,虽然我们有时候声明变量并注意加var 和不加var的区别,代码也能正常实现功能,但是两者还是有区别的:

  1. 在函数体中,加var,变量是局部变量,作用域是所在的函数作用域;不加var则是全局变量,作用域是全局作用域
  2. 在全局作用域中,两者都一样
  3. 加var会进行变量提升
  4. 浏览器执行的时候,在全局作用域中,两者都会将声明的变量挂载到window对象中
function test() {
	c = 3
}

a = 1
var b = 2

console.log(a, window.a) // 1 1
console.log(b, window.b) // 2 2
console.log(c) // 报错:c is not defined
console.log(window.c) // undefined
test()
console.log(c, window.c) // 3 3
// 加var进行变量提升

console.log(a) // undefined
console.log(b) // 报错:b is not defined

var a = 1
b = 2

console.log(a) // 1
console.log(b) // 2

函数

讲这个之前,先说一个概念:匿名函数,顾名思义匿名函数指的是没有名字的函数。

匿名函数可以被当成变量一样使用,可以用来赋值,作为对象的属性,作为回掉函数等等;它也可以进行自调用:

// 使用!开头
!function(){
	console.log('ni hao');
}
// 能够将匿名函数与调用的()为一个整体,官方推荐使用
(function(){
	console.log('hello');
}());

函数有两种声明方式(还有一种Function构造函数的方式,这里就不展开了):

  • 函数表达式(Function Expression):即将匿名函数赋值给一个变量。

  • 函数声明(Function Declaration):是一种独立的结构,它会声明一个具名函数,必须以function开头。且函数声明会进行函数提升,使它能在其所在作用域的任意位置被调用。后面的代码可以将此函数通过函数名赋值给变量或者对象属性。

如果在声明函数的过程中使用了var,那么肯定是函数表达式的声明方式;如果没有使用var,则可能是函数声明,也有可能是函数表达式声明

  • 同样是表达式声明方式,加var和不加var与声明变量的区别一样
  • 函数声明方式会将函数体提升到所在作用域的最前面
// 带var

var b = function() {
	console.log(2)
}
b() // 2
// 不带var
a =  function(){
	console.log(1)
}
function c() {
	console.log(3)
}

a() // 1
c() // 3
// 函数提升:log(3)的函数被提到最前,被之后的Log(1)给覆盖

var a = function(){
	console.log(1)
}
function a() {
	console.log(3)
}
a() // 1

函数提升和变量提升,那么谁提的更前以前呢,我的理解是变量提升提更前一点,看如下代码:

a() // 3
function a() {
	console.log(3)
}
a() // 3
var a = function(){
	console.log(1)
}
a() // 1

以上代码相当于:

var a
function a() {
	console.log(3)
}
a() // 3
a() // 3
a = function(){
	console.log(1)
}
a() //1
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值