欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript使用閉包模仿塊級作用域操作示例

 更新時間:2019年01月21日 14:14:45   作者:saberVIII  
這篇文章主要介紹了JavaScript使用閉包模仿塊級作用域操作,結合實例形式分析了javascript閉包的原理及模仿塊級作用域相關操作技巧,需要的朋友可以參考下

本文實例講述了JavaScript使用閉包模仿塊級作用域操作。分享給大家供大家參考,具體如下:

在閱讀這篇文章之前,建議先閱讀JavaScript的作用域鏈以及JavaScript閉包。

正如閉包的定義一樣:“閉包指的是有權訪問另一個函數作用域中的變量的函數”, 閉包最大的意義就在于閉包可以對另一個函數作用域的變量進行訪問,由此,閉包可以延伸出一系列的用法。

模仿塊級作用域

JavaScript沒有塊級作用域的概念。這意味著在塊語句中定義的變量,實際上是包含在函數中而非語句中創(chuàng)建的。從作用域鏈的角度來理解是,所有在函數內定義的變量(所有,也就是說塊語句中定義的變量也包含在內)都會在這個函數執(zhí)行時所創(chuàng)建的函數的活動對象中,因此從函數內的所有變量定義開始,就可以在函數內部隨處訪問它,閉包也可以通過作用域鏈訪問它。
例子:

function outputNumbers(count){
  for(var i = 0; i < count; i++){
    console.log(i); // 0, 1, ... count - 1
  }
  console.log(i); // count
}

C++, JAVA等語言中,變量i只會在for循環(huán)的語句塊(block)中有定義,循環(huán)一旦結束,變量i就會被銷毀??墒窃贘avaScript中,變量i是定義在outputNumbers()的活動對象中,因此從函數內的所有變量定義開始,就可以在函數內部隨處訪問它,閉包也可以通過作用域鏈訪問它。即使像下面這樣重新聲明同一個變量,也不會改變它的值。

function outputNumbers(count){
  for(var i = 0; i < count; i++){
    console.log(i); // 0, 1, ... count - 1
  }
  var i;     // redeclare i
  console.log(i); // count
}

JavaScript從來不管是否多次聲明了同一個變量;遇到這種情況,JavaScript只會對后續(xù)的聲明視而不見(不過會執(zhí)行后續(xù)聲明中的變量初始化),將其當成一個賦值語句。

函數包裝器可以用來模仿塊作用域并避免這個問題。

函數包裝器就是創(chuàng)建并立即調用一個函數。

(function(){
  console.log("Hello World!");
})();

這段代碼直接輸出”Hello World”, 這就是一個函數包裝器。

函數包裝器的作用:

1. 立即執(zhí)行函數中的代碼,又不會再內存中留下對該函數的引用;

2. 函數內部的所有變量都會被立即銷毀(除非將這些變量賦值給了包含作用域中的變量)。

當在函數內部使用函數包裝器的時候,此時函數包裝器就是一個閉包,有權訪問外部環(huán)境中的所有變量。

function outputNumbers(count){
  (function(){
    //塊級作用域
    for(var i = 0; i < count; i++){
      console.log(i); // 0, 1, ... count - 1
    }
  })();
  console.log(i); // error
}

在函數包裝器中可以訪問外部環(huán)境outputNumbers()的變量count,打印0, 1, … count - 1,但是在函數包裝器執(zhí)行完畢之后,再訪問變量i就會拋出錯誤,因為i是在函數包裝器中定義的,outputNumbers()函數無法訪問。

無論在什么地方,如果只需要一些臨時變量,就可以使用塊級作用域!

使用函數包裝器這種閉包可以減少閉包過多占用內存的問題。因為沒有指向匿名函數的引用, 所以只要函數包裝器執(zhí)行完畢,就可以立即銷毀其作用域鏈了。

函數包裝器這種技術經常在全局作用域中被用在函數外部,從而限制想全局作用域中添加過多的變量和函數。一般來說,我們都應該盡量少向全局作用域中添加變量和函數。過多的全局變量和函數很容易導致命名沖突。通過創(chuàng)建塊級作用域,每個開發(fā)人員既可以使用自己的變量,有不必擔心搞亂全局作用域。例如:

(function(){
  var now = new Date();
  if (now.getMonth() == 0 && now.getDate() == 1) {
    console.log("Happy new year");
  }
})();

將這段代碼放在全局作用域中,可以用來確定哪天是一月一日。其中變量now現在是匿名函數中的局部變量,避免了在全局變量中創(chuàng)建。

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結

希望本文所述對大家JavaScript程序設計有所幫助。

相關文章

  • JS控制HTML元素的顯示和隱藏的兩種方法

    JS控制HTML元素的顯示和隱藏的兩種方法

    本文給大家分享兩種方法來控制html元素的顯示和隱藏,分別利用html的style中兩個屬性,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09
  • JS中${}什么意思有什么作用

    JS中${}什么意思有什么作用

    在JavaScript中,${}用于模板文字(template?literals),為ES6中新增的字符串方法,其作用是配合反單引號實現字符串拼,代替以前傳統(tǒng)復雜的引號雙引號與+的拼接,簡介明了,非常好用,本文給大家介紹JS中‘${}‘什么意思有什么作用,感興趣的朋友一起看看吧
    2023-08-08
  • 微信小程序之事件交互操作實例分析

    微信小程序之事件交互操作實例分析

    這篇文章主要介紹了微信小程序之事件交互操作,結合實例形式分析了微信小程序事件響應、交互及界面布局等相關操作技巧與注意事項,需要的朋友可以參考下
    2018-12-12
  • Javascript中的神器——Promise

    Javascript中的神器——Promise

    本文主要介紹了Javascript中Promise的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • javascript inneHTML的地雷

    javascript inneHTML的地雷

    大家都喜歡用innerHTML添加內容,但是innerHTML這東西在兩大陣營中有許多不同。
    2010-02-02
  • javascript讓setInteval里的函數參數中的this指向特定的對象

    javascript讓setInteval里的函數參數中的this指向特定的對象

    話說阿里巴巴今年的校園招聘有一道題目考了一個知識點,那就是setInterval的參數函數里的this指向.
    2010-01-01
  • Echarts折線圖設置線條顏色及線條以下代碼示例

    Echarts折線圖設置線條顏色及線條以下代碼示例

    最近項目需要,一直在使用Echarts視圖,現在遇到一個要修改echarts折線圖顏色的需求,下面這篇文章主要給大家介紹了關于Echarts折線圖設置線條顏色及線條以下區(qū)域漸變顏色的相關資料,需要的朋友可以參考下
    2024-02-02
  • JavaScript 原型學習總結

    JavaScript 原型學習總結

    每個對像都有一個隱慝的屬性用于指向到它的父對像(構造對像的函數)的原型(這里稱為父原型或隱式原型),并從中繼承它的屬性和方法
    2010-10-10
  • JS遍歷樹層級關系實現原理解析

    JS遍歷樹層級關系實現原理解析

    這篇文章主要介紹了JS遍歷樹層級關系實現原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 分享兩段簡單的JS代碼防止SQL注入

    分享兩段簡單的JS代碼防止SQL注入

    下面小編就為大家分享兩段簡單的JS代碼防止SQL注入。小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-04-04

最新評論