技術頻道導航
HTML/CSS
.NET技術
IIS技術
PHP技術
Js/JQuery
Photoshop
Fireworks
服務器技術
操作系統(tǒng)
網站運營

贊助商

分類目錄

贊助商

最新文章

搜索

JS面試問題:什么是閉包,你為什么要使用閉包

作者:admin    時間:2022-6-2 16:40:11    瀏覽:

本文將介紹什么是閉包,和使用閉包的原因,以及閉包的工作方式,結合示例詳細了解閉包在JavaScript中的作用。

什么是閉包,你為什么要使用閉包

什么是閉包,為什么要使用閉包?

閉包是外部函數內部的內部函數。它們有自己的局部作用域,可以訪問外部函數的作用域、參數(但不是參數對象),還可以訪問全局變量。

我們使用閉包的原因是因為 Javascript 是函數級范圍,而不是與其他語言一樣是塊級范圍。另外, Javascript 是異步/事件驅動語言,經常使用閉包的例子是 jQuery(例如 click())。

閉包是如何工作的?

閉包的工作方式:

  1. 在其外層函數執(zhí)行完畢并返回值后,閉包仍然可以運行。
  2. 閉包存儲對外部函數變量的引用,因此,我們將始終可以訪問外部函數變量的更新值。
  3. 因為我們可以訪問外部函數變量的更新值,當變量通過 for 循環(huán)更改時,我們將遇到問題/錯誤,但這可以通過使用 IIFE(立即調用函數表達式)來解決。

閉包的示例代碼

下面是在 IIFE 中使用閉包的示例代碼。

注意,IIFE 或立即調用函數表達式是另一個 Javascript 概念。

/*
 這段代碼的目標是能夠為每個博客帖子生成唯一的id
 使用閉包和IIFE(立即調用函數表達式),通過聲明外部函數并使用[]訪問特定帖子
*/

// 這里,我們創(chuàng)建一個以json格式保存示例數據的變量
var blogPost = [
{
  title: 'title0',
  id: 0 },

{
  title: 'title1',
  id: 0 },

{
  title: 'title2',
  id: 0 }
];

/*
  我們將創(chuàng)建一個函數,為博客帖子生成唯一id
  此函數接受post參數(我們將在此處傳遞blogPost json數據)
*/
function generateBlogPostID(thePost) {
  var uniqueID = 100; // 這將保存從for循環(huán)和閉包生成的唯一id

  // 這個for循環(huán)將遍歷blogPost json var中的每個項目
  for (var i = 0; i < thePost.length; i++) {
    /* 
      我們訪問每個blogPost項目的id
      并為每個blogPost項目id分配一個閉包函數
    */
    thePost[i]['id'] = function (j) {// j參數變量是我在調用IIFE(立即調用函數表達式)時傳入的
      return uniqueID + j; // for循環(huán)的每次迭代都會將i的當前值傳遞到IIFE(立即調用函數表達式)中,并將正確的值保存到數組中
    }(i); // 立即調用此函數,將i變量作為參數傳遞
  }

  return thePost;
}

// 現在我們開始測試
var createIDforBlogPost = generateBlogPostID(blogPost);

var blog0 = createIDforBlogPost[0];
console.log(blog0.id);  // 100

var blog1 = createIDforBlogPost[1];
console.log(blog1.id);  // 101

var blog2 = createIDforBlogPost[2];
console.log(blog2.id);  // 102

demodownload

輸出

100
101
102

 

代碼解釋

這段代碼的目標是能夠為每個博客帖子生成唯一的id,使用閉包和IIFE(立即調用函數表達式),通過聲明外部函數并使用[]訪問特定帖子。

1、var blogPost 是我們創(chuàng)建一個以json格式保存示例數據的變量。

2、function generateBlogPostID(thePost) 是我們創(chuàng)建的一個函數,為博客帖子生成唯一id,此函數接受post參數(我們將在此處傳遞blogPost json數據)。

3、var uniqueID = 100; 這將保存從for循環(huán)和閉包生成的唯一id。

4、for (var i = 0; i < thePost.length; i++) 這個for循環(huán)將遍歷blogPost json var中的每個項目。

5、閉包的使用

thePost[i]['id'] = function (j) 
      return uniqueID + j; 
}(i);
  • 我們訪問每個blogPost項目的id,并為每個blogPost項目id分配一個閉包函數。
  • j參數變量是在調用IIFE(立即調用函數表達式)時傳入的。
  • for循環(huán)的每次迭代都會將i的當前值傳遞到IIFE(立即調用函數表達式)中,并將正確的值保存到數組中。
  • (i) 表示立即調用此函數,將i變量作為參數傳遞。

6、console.log(blog0.id); 輸出得到的id。

總結

本文介紹了什么是閉包,和使用閉包的原因,以及閉包的工作方式,結合一個示例的分析,通過本文的學習,你應該對閉包的認識更進一步。

您可能對以下文章也感興趣

標簽: 閉包  
相關文章
    x