国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

作用域和作用域鏈

MageekChiu / 1222人閱讀

摘要:這里一共說了三種作用域,其實可以說是兩種一種是全局作用域,而是局部作用域函數作用域塊級作用域,塊級作用域概念又包括了函數作用域。

作用域:

變量所在的上下文,指的是變量在哪些地方可以訪問

對于JavaScript來說有全局作用域但是沒有塊級作用域,在ES6中引入了關鍵字let可以生成塊作用域.見以下代碼:

var value = true
if (value) {
  var age = 18
  console.log(`我今年${age}歲了`)
}
console.log (`我也是${age}歲了哦`)

//輸出  "我今年18歲了"   "我也是18歲了哦"
// 可見在if()中不存在塊級作用域

在這里if()里的變量具有全局作用域,全局皆可使用

var value = true
if (value) {
  let age = 18
  console.log(`我今年${age}歲了`)
}
console.log (`我也是${age}歲了哦`)

/*輸出
  "我今年18歲了"
  "error"
  "ReferenceError: age is not defined*/

在這里使用關鍵字let 使 if () 塊里的變量age產生了塊級作用域,使得它只在這個塊里生效.

JS中有函數作用域,指的是作用域在函數內部。這里一共說了三種作用域,其實可以說是兩種:一種是全局作用域,而是局部作用域(函數作用域、塊級作用域),塊級作用域概念又包括了函數作用域。

簡要說下幾個作用域聲明方式:

全局作用域:在所有函數外部使用var語句聲明變量或者在聲明變量時忽略var則會隱式轉化為全局變量

函數作用域: 需要在函數內部使用var 聲明變量才行

塊級作用域: 在變量名前添加let語句聲明(ES6)

作用域鏈
var a = "你好,我是a";
function scopeChain(a) {
  var b =1;
  function inScope(a) {
     var c = "螞蟻"
     console.log(`大象愛${c}`)
     console.log(`我是最內層的函數,這里也可以使用a: ${a}`)
  }
  console.log(`能使用a嗎?${a}`)
  inScope(a)
}
scopeChain(a)

這里a是全局作用域下的變量,b是函數scopeChain()作用域下的變量,而c是函數scopeChain()里的inScope()函數作用域下的變量。

作用域鏈的前端始終是當前環境作用域下變量對象,逐層往外作用域鏈接,最后端是全局變量環境下的變量,這些變量時鏈接在一起,在解析一個變量時從鏈前端往后端搜索(從內不找外部找),但是有一點值得注意:每個變量的作用域總是從自身聲明的作用域往外找,而不是調用它的地方

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()

 //輸出1

這里就是當fn1() 執行后調用 fn2() 時,發現fn3()作用域下沒有,也就是作用域鏈前端沒有,往外找一層也就是fn1()作用域下進行查找,作用域也就往后端前進了一步,發現還是沒有,繼續往外層作用域查找找到了全局作用域,也就是作用域鏈的最后端,找到了后調用它。

但是對于fn2()來說它需要調用a這個變量,這里也就出現了誤區:在fn3()里有變量a,那么是用的是這個變量a嗎?

但其實fn2()是發現不了這個變量a的,因為fn2()聲明的地方并不在fn3()里,同理fn1()也不是fn2()聲明的地方,所以對于fn2()來說它只發現了全局下的 var a =1 所以調用它并輸出a時也就等于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()

//輸出多少?

由以上的論述可以分析出這段代碼,當fn1()被調用時也就是 return fn3 ,也就調用了fn3(),然后fn3()里又是調用fn2(),而fn() 是在fn1()里聲明的,自然也就使用了fn1()里的變量a,又因為a變量在調用前聲明并賦值了,故此輸出為2

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()

//輸出多少?

分析這段代碼,發現與上面代碼不同之處在于先聲明了 ` var a 后沒有里脊賦值,在調用了fn2()后再進行的賦值,那么這里應該是多少呢?

這里也就牽涉到了聲明前置,對于fn3()下,當聲明 var a時,也就是執行到了fn3()代碼前,函數聲明和變量聲明會提前至代碼前端,所以這里聲明并沒有影響到輸出值得改變,但是賦值操作是按照程序順序執行的,當調用前,a只聲明沒有賦值,則會輸出undefined。 而具體變量查找是符合作用域鏈的順序來的.

總結如下:

函數在執行的過程中,先從自己內部找變量

如果找不到,再從創建當前函數所在的作用域去找, 以此往上

注意找的是變量的當前的狀態

個人學習備忘,如有謬誤,歡迎指正。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94373.html

相關文章

  • 理解JavaScript中的作用域和作用域鏈

    摘要:示例當一個函數創建后,它的作用域鏈會被創建此函數的作用域中可訪問的數據對象填充。每一個運行期上下文都和一個作用域鏈關聯。此時,作用域鏈中函數的所有局部變量所在的作用域對象會被推后,訪問代價變高了。 作用域 作用域就是變量與函數的可訪問范圍,即作用域控制著變量與函數的可見性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。 作用域鏈 函數對象有一個內部屬性[...

    XanaHopper 評論0 收藏0
  • JavaScript 作用域和作用域鏈學習

    摘要:作用域與作用域鏈每個函數都有自己的執行環境。這是初步了解作用域,如想更深入了解作用域,請看下面鏈接作用域原理作用域鏈由一道題圖解的作用域或者看權威指南和高級程序設計 本文是我學習JavaScript作用域整理的筆記,如有不對,請多指出。 作用域 一個變量的作用域是程序源代碼中定義這個變量的區域。 而在ES5中只分為全局作用域和函數作用域,也就是說for,if,while等語句是不會創建...

    史占廣 評論0 收藏0
  • 深入理解JavaScript作用域和作用域鏈

    前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優質文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數和對象的可訪問性。換句話說,作用域決定了代碼區塊中變量和其他資源的可見...

    baiy 評論0 收藏0
  • 深入理解JavaScript作用域和作用域鏈

    前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優質文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數和對象的可訪問性。換句話說,作用域決定了代碼區塊中變量和其他資源的可見...

    ytwman 評論0 收藏0
  • 深入javascript——作用域和閉包

    摘要:注意由于閉包會額外的附帶函數的作用域內部匿名函數攜帶外部函數的作用域,因此,閉包會比其它函數多占用些內存空間,過度的使用可能會導致內存占用的增加。 作用域和作用域鏈是javascript中非常重要的特性,對于他們的理解直接關系到對于整個javascript體系的理解,而閉包又是對作用域的延伸,也是在實際開發中經常使用的一個特性,實際上,不僅僅是javascript,在很多語言中都...

    oogh 評論0 收藏0

發表評論

0條評論

MageekChiu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<