摘要:閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。而此時(shí)我們嘗試在返回之前更改得到證明。我們一般讓其返回一個(gè)函數(shù),是希望這個(gè)閉包能按照我們的預(yù)期進(jìn)行。
閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。
常見閉包出現(xiàn)的問(wèn)題
function createFunction(){ var result = new Array(); for(var i=0; i<10; i++){ result[i] = function(){ return i; } } console.log("i 的值:"+ i) return result; }
createFunction() 返回的結(jié)果
當(dāng)我們調(diào)用 createFunction()[1]();時(shí)返回的是
事實(shí)上arr的每一項(xiàng)調(diào)用的結(jié)果都是10
為什么呢?
事實(shí)上你在調(diào)用每一項(xiàng)時(shí),其實(shí)是這樣的
function childFunction(){ var i = 10; return function(){ return i; } }
這個(gè) i 來(lái)自它的父級(jí)作用域
或者我們這么說(shuō),return i; 中的 i 跟 for循環(huán)中的 i 其實(shí)是不一樣的。因?yàn)榇藭r(shí)的
函數(shù)并沒有調(diào)用,而當(dāng)你調(diào)用的時(shí)候,它才去作用域鏈搜索 i 的值。而此時(shí) i = 10;
我們嘗試在返回之前更改 i =9999;
得到證明。
那么要怎樣才能讓它返回我們預(yù)期的那樣呢?
我們只要把 result [i] 中的 i 當(dāng)做參數(shù)傳進(jìn)函數(shù)
result[i] = (function(num){ return function(){ return num; } })(i)
這一段代碼到底發(fā)生了什么?我們讓 外層 的函數(shù)傳入?yún)?shù)并立即執(zhí)行,此時(shí)里面的 num 等于傳入的參數(shù), 等到最內(nèi)層函數(shù)調(diào)用的時(shí)候,它會(huì)拿到外層的num。
最后,很多人以為閉包指的是一個(gè)函數(shù)被一個(gè)函數(shù)返回,其實(shí)不是。它指的是 有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù),跟是不是被 返不返回并沒有關(guān)系。我們一般讓其返回一個(gè)函數(shù),是希望這個(gè)閉包能按照我們的預(yù)期進(jìn)行。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95031.html
摘要:對(duì)于一個(gè)個(gè)剛剛接觸前端的新手,天天聽人講閉包,聽的那個(gè)高大尚,心中對(duì)各位技術(shù)大佬是那個(gè)的膜拜,于是做為前端菜鳥的我,就去了解了傳說(shuō)中的閉包。 對(duì)于一個(gè)個(gè)剛剛接觸前端的新手,天天聽人講閉包,聽的那個(gè)高大尚,心中對(duì)各位技術(shù)大佬是那個(gè)的膜拜,于是做為前端菜鳥的我,就去了解了傳說(shuō)中的閉包。 何為閉包?通俗易懂的講,就是可以調(diào)用函數(shù)內(nèi)部的變量和方法 舉例說(shuō)明如下: function t...
摘要:設(shè)計(jì)模式得存在讓系統(tǒng)代碼可重用可擴(kuò)展可解耦更容易被人理解且保證代碼可靠性。設(shè)計(jì)模式使代碼真正工程化。設(shè)計(jì)模式是一個(gè)龐大而又復(fù)雜的體系,單例模式大概是種設(shè)計(jì)模式中相對(duì)比較簡(jiǎn)單的一種。了解完高階函數(shù)可能加快我們理解設(shè)計(jì)模式喲 showImg(https://segmentfault.com/img/bVbgyeK?w=500&h=375); 設(shè)計(jì)模式得存在讓系統(tǒng)代碼可重用、可擴(kuò)展、可解耦、...
摘要:為什么要采用面向?qū)ο缶幊探鉀Q問(wèn)題更容易設(shè)計(jì)計(jì)算機(jī)程序就是為了解決人類的問(wèn)題。面向?qū)ο缶幊绦枰獙?duì)業(yè)務(wù)及代碼的架構(gòu)是有一定的要求的。 1. 編程方式 我們目前的編程方式大體可以有以下三種編程方式: 順序編程 過(guò)程式編程 面向?qū)ο缶幊? 在講面向?qū)ο缶幊虝r(shí)先講一下什么是順序編程,什么是過(guò)程式編程,什么是面向?qū)ο缶幊蹋? 順序編程: 就是只用一個(gè)單線程去執(zhí)行一段代碼,執(zhí)行過(guò)程根據(jù)代碼依次從上...
摘要:打開源碼,首先你會(huì)看到這樣的代碼結(jié)構(gòu)這是一個(gè)自調(diào)用匿名函數(shù)。模式,是自執(zhí)行函數(shù)的高級(jí)模式,可以非常方便的在各個(gè)匿名閉包中以全局對(duì)象調(diào)用閉包函數(shù)。 打開jQuery源碼,首先你會(huì)看到這樣的代碼結(jié)構(gòu): (function(window,undefined ){ // })(); 這是一個(gè)自調(diào)用匿名函數(shù)。什么東東呢?在第一個(gè)括號(hào)內(nèi),創(chuàng)建一個(gè)匿名函數(shù);第二個(gè)括號(hào),立即執(zhí)行 為什么要?jiǎng)?chuàng)建這樣一個(gè)...
摘要:構(gòu)造函數(shù)通過(guò)原型繼承了構(gòu)造函數(shù)和原型,這就形成了一個(gè)鏈條,通俗的講就是原型鏈繼承。而且方法只能冒充構(gòu)造函數(shù)里面的屬性和方法而無(wú)法冒充原型對(duì)象里面的屬性和方法還有最大的問(wèn)題就是重復(fù)使用。 前言: 寫到這里,差不多就把OOP完結(jié)了,寫了幾篇OOP的文章,但是只是略懂皮毛,可能深入的OOP還有很多,但是我感覺寫到這里也算是差不多完結(jié)了。 繼承 繼承是面向?qū)ο蟊容^核心的概念,其他語(yǔ)言可能實(shí)現(xiàn)...
閱讀 2689·2021-11-24 10:44
閱讀 1972·2021-11-22 13:53
閱讀 1983·2021-09-30 09:47
閱讀 3733·2021-09-22 16:00
閱讀 2467·2021-09-08 09:36
閱讀 2336·2019-08-30 15:53
閱讀 2818·2019-08-30 15:48
閱讀 1024·2019-08-30 15:44