JavaScript 函数作用域

2018-10-22  本文已影响0人  勇者闯魔城

一.作用域

作用域指的是变量存在的范围。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,调用fn2console.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() 
上一篇下一篇

猜你喜欢

热点阅读