|
|
|
|
|
本文將介紹什么是閉包,和使用閉包的原因,以及閉包的工作方式,結合示例詳細了解閉包在JavaScript中的作用。
閉包是外部函數內部的內部函數。它們有自己的局部作用域,可以訪問外部函數的作用域、參數(但不是參數對象),還可以訪問全局變量。
我們使用閉包的原因是因為 Javascript 是函數級范圍,而不是與其他語言一樣是塊級范圍。另外, Javascript 是異步/事件驅動語言,經常使用閉包的例子是 jQuery(例如 click())。
閉包的工作方式:
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
輸出
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);
j
參數變量是在調用IIFE(立即調用函數表達式)時傳入的。for
循環(huán)的每次迭代都會將i的當前值傳遞到IIFE(立即調用函數表達式)中,并將正確的值保存到數組中。(i)
表示立即調用此函數,將i
變量作為參數傳遞。6、console.log(blog0.id);
輸出得到的id。
本文介紹了什么是閉包,和使用閉包的原因,以及閉包的工作方式,結合一個示例的分析,通過本文的學習,你應該對閉包的認識更進一步。
您可能對以下文章也感興趣