JS作用鏈域

原理:

1、函數(shù)在執(zhí)行時(shí)先從自己內(nèi)部的局部作用域中查找變量
2、如果在函數(shù)內(nèi)部找不到,則在定義此函數(shù)的作用域中查找變量
3、依次往上,直至全局作用域,如果在全局作用域中依然找不到,則報(bào)錯(cuò)

原理看著抽象,讓我們通過幾個(gè)例子來加深下了解:

例1:
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() //輸出多少

調(diào)用過程:調(diào)用fn()=>fn1(),fn1()返回fn3,調(diào)用fn3,fn3中調(diào)用了fn2,輸出2。
分析:fn2中沒有a變量,fn2被定義在fn1中,獲得fn1中的變量a=2

例2:
var a = 1
function fn1(){
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
function fn2(){
  console.log(a)
}
var fn = fn1()
fn() //輸出多少

調(diào)用過程:fn()=>fn1()=>fn3()=>fn2()=>consolo.log(a)=>輸出
分析:fn2中沒有a變量,在fn1作用域中尋找,任沒有,在全局作用域?qū)ふ?,輸?

例3:
var a = 1
function fn1(){

  function fn3(){
    function fn2(){
      console.log(a)
    }
    var a

    fn2()
    a = 4
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //輸出多少

調(diào)用過程:fn()=>fn1()=>fn3()=>fn2()=>console.log(a)=>輸出undefined
分析: fn2內(nèi)部沒有a變量,fn3中尋找,var a已經(jīng)定義,但未賦值,所以輸出undefined

總結(jié):作用域鏈不難,先找局部變量,再往定義該函數(shù)的作用域?qū)ふ易兞浚钡饺肿饔糜蚣纯伞?/h6>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 原理: 1、函數(shù)在執(zhí)行時(shí)先從自己內(nèi)部的局部作用域中查找變量2、如果在函數(shù)內(nèi)部找不到,則在定義此函數(shù)的作用域中查找變...
    春餅sama閱讀 474評(píng)論 0 0
  • 以前理解的作用鏈域 函數(shù)在執(zhí)行的過程中,首先從自身的函數(shù)作用域找變量; 如果從自身內(nèi)部找不到變量,就向上一層尋找變...
    饑人谷_momo閱讀 835評(píng)論 0 0
  • 1. 作用域 JS中的變量和函數(shù)并不總是可用的,有其使用的范圍,這就是作用域。 JS的作用域靠函數(shù)形成,函數(shù)內(nèi)聲明...
    饑人谷_張曉霞閱讀 476評(píng)論 0 0
  • JavaScript是基于詞法作用域的語言:通過閱讀包含變量定義在內(nèi)的數(shù)行源碼就能知道變量的作用域。作用域:即變量...
    PingerL閱讀 129評(píng)論 0 0
  • 第 1 題 立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用? 1. 立即執(zhí)行函數(shù)是什么 立即執(zhí)行函數(shù)就是 聲明一個(gè)匿名函數(shù) ...
    紅豆丁244閱讀 426評(píng)論 0 0

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