一.作用域
作用域指的是变量存在的范围。ES5 有2种。一是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;二是函数作用域,变量只在函数内部存在。
全局变量:函数外部声明的变量就是,它可以在函数内部读取。
局部变量:在函数内部定义的变量,外部无法读取。
注意:函数内部定义的变量,会在该作用域内覆盖同名全局变量。
二.执行函数过程中,内部变量的查找顺序。
函数在执行的过程中,先从自己内部找变量。如果找不到,再从创建当前函数所在的作用域去找, 以此往上。(注:函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域)
var a = 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
var fn = fn1()
fn()
// 2
调用fn1
,调用fn3
,调用fn2
,console.log(a)
,fn2
内没有变量a
,便查找fn2
声明所在的作用域fn1
找到var a =2
。
三.函数作用域与变量提升
与全局作用域一样,函数作用域内部也会产生“变量提升”现象。var
命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部
var a = 1
function fn1(){
function fn3(){
function fn2(){
console.log(a)
}
fn2()
var a = 4
}
var a = 2
return fn3
}
var fn = fn1()
fn()
// undefined
注意:因为函数fn2调用在var a = 4
之前,所以fn2
读取的是变量前置的a
的初始值undefined
。可以看成以下。
var a = 1
function fn1(){
function fn3(){
var a
function fn2(){
console.log(a)
}
fn2()
a = 4
}
var a = 2
return fn3
}
var fn = fn1()
fn()