JS作用鏈域

原理:

1、函數在執(zhí)行時先從自己內部的局部作用域中查找變量
2、如果在函數內部找不到,則在定義此函數的作用域中查找變量
3、依次往上,直至全局作用域,如果在全局作用域中依然找不到,則報錯
是曰:作用域鏈

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

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

調用過程:調用fn()=>fn1(),fn1()返回fn3,調用fn3,fn3中調用了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() //輸出多少

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

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

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

總結:作用域鏈不難,先找局部變量,再往定義該函數的作用域尋找變量,直到全局作用域即可。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容