变量
在开发过程中,虽然我们有时候声明变量并注意加var 和不加var的区别,代码也能正常实现功能,但是两者还是有区别的:
- 在函数体中,加var,变量是局部变量,作用域是所在的函数作用域;不加var则是全局变量,作用域是全局作用域
- 在全局作用域中,两者都一样
- 加var会进行变量提升
- 浏览器执行的时候,在全局作用域中,两者都会将声明的变量挂载到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