JavaScript 函數(shù)作用域

一.作用域

作用域指的是變量存在的范圍。ES5 有2種。一是全局作用域,變量在整個程序中一直存在,所有地方都可以讀??;二是函數(shù)作用域,變量只在函數(shù)內(nèi)部存在。

全局變量:函數(shù)外部聲明的變量就是,它可以在函數(shù)內(nèi)部讀取。
局部變量:在函數(shù)內(nèi)部定義的變量,外部無法讀取。
注意:函數(shù)內(nèi)部定義的變量,會在該作用域內(nèi)覆蓋同名全局變量。

二.執(zhí)行函數(shù)過程中,內(nèi)部變量的查找順序。

函數(shù)在執(zhí)行的過程中,先從自己內(nèi)部找變量。如果找不到,再從創(chuàng)建當(dāng)前函數(shù)所在的作用域去找, 以此往上。(注:函數(shù)執(zhí)行時所在的作用域,是定義時的作用域,而不是調(diào)用時所在的作用域)

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 調(diào)用fn1,調(diào)用fn3,調(diào)用fn2 ,console.log(a),fn2內(nèi)沒有變量a,便查找fn2聲明所在的作用域fn1找到var a =2

三.函數(shù)作用域與變量提升

與全局作用域一樣,函數(shù)作用域內(nèi)部也會產(chǎn)生“變量提升”現(xiàn)象。var命令聲明的變量,不管在什么位置,變量聲明都會被提升到函數(shù)體的頭部

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 注意:因為函數(shù)fn2調(diào)用在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() 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容