攻城狮-web

函数变量提升

变量提升

在js中,理解变量作用域以及变量提升是非常重要的,以下的几点需要我们认真掌握

  • 变量作用域——一个变量的作用域表示它在这个变量存在的上下文,它指定了你可以访问哪些变量以及是否有权限去访问某些变量。
  • 变量作用域分为全局作用域和局部作用域。
  • 局部变量(处于函数级别的作用域,只是在函数内部使用)
  • 一个函数内部定义的变量只能在函数的内部使用或者函数内部嵌套的函数调用(闭包除外)

    案例

demo 1

1
2
3
4
5
var a
console.log(a) //undefine
var a = 1;
console.log(a) //1

demo 2

1
2
3
4
5
6
7
8
9
函数表达式
fun()
var fun = function(){
console.log("今天放假")
}
以上函数实际执行的过程
var fun,
fun() //fun is undefined(这是一个error)

demo 3

1
2
3
4
5
6
函数声明
fun()
var fun = function(){
console.log("今天放假")
}
console.log(fun) //function fun() [打印出完整函数]

demo 4

1
2
3
4
5
6
函数声明与变量声明
var fun = 1;
alert(fun) //1
function fun(){}
alert(fun) //function(){}

函数声明的优先级高于变量声明,如果这两者同时声明,函数声明会覆盖变量声明


1
2
3
4
5
6
7
var a = 2;
function show(){
console.log(a)
var a = 21;
console.log(a) //21
}
show() //a is not defined

以上代码实际执行的流程
var a = 1;
function show(){
var a;
console.log(a) //undefined
a = 2;
console.log(a) //2
}
show() //a is not defined
demo 5

1
2
3
4
5
6
7
8
内部取消var
var a = 10;
function fn(){
console.log(a) //10 内部没有变量var,所以只能获取到外部的vae
a = 2;
console.log(a) //2 这里的a是全局变量
}
fn()

demo 6

命名函数表达式

声明函数表达式的名字不会进入名字空间,外部的都取不到

1
2
var obj = function fn(){}
alert(a) //a is not defined

在函数的内部

1
var obj = function fn(){alert(a)}

demo 7

1
2
3
4
5
6
7
8
函数参数
function fn(a,b){
console.log(a)
//没有参数的情况下---undefined
//有参数的情况下---3
var a = 3;
}
fn(3)

demo 8

1
2
3
4
5
6
混合函数
function fn(a,b){
console.log(fn) //function(){}
function fun(){}
}
fn(4)

函数声明的优先级>参数>var变量