摘要:閉包是指有權訪問另一個函數作用域中的變量的函數。創建閉包的常見方式,就是在一個函數內部創建另一個函數。而此時我們嘗試在返回之前更改得到證明。我們一般讓其返回一個函數,是希望這個閉包能按照我們的預期進行。
閉包是指有權訪問另一個函數作用域中的變量的函數。創建閉包的常見方式,就是在一個函數內部創建另一個函數。
常見閉包出現的問題
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() 返回的結果
當我們調用 createFunction()[1]();時返回的是
事實上arr的每一項調用的結果都是10
為什么呢?
事實上你在調用每一項時,其實是這樣的
function childFunction(){ var i = 10; return function(){ return i; } }
這個 i 來自它的父級作用域
或者我們這么說,return i; 中的 i 跟 for循環中的 i 其實是不一樣的。因為此時的
函數并沒有調用,而當你調用的時候,它才去作用域鏈搜索 i 的值。而此時 i = 10;
我們嘗試在返回之前更改 i =9999;
得到證明。
那么要怎樣才能讓它返回我們預期的那樣呢?
我們只要把 result [i] 中的 i 當做參數傳進函數
result[i] = (function(num){ return function(){ return num; } })(i)
這一段代碼到底發生了什么?我們讓 外層 的函數傳入參數并立即執行,此時里面的 num 等于傳入的參數, 等到最內層函數調用的時候,它會拿到外層的num。
最后,很多人以為閉包指的是一個函數被一個函數返回,其實不是。它指的是 有權訪問另一個函數作用域中的變量的函數,跟是不是被 返不返回并沒有關系。我們一般讓其返回一個函數,是希望這個閉包能按照我們的預期進行。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95031.html
摘要:設計模式得存在讓系統代碼可重用可擴展可解耦更容易被人理解且保證代碼可靠性。設計模式使代碼真正工程化。設計模式是一個龐大而又復雜的體系,單例模式大概是種設計模式中相對比較簡單的一種。了解完高階函數可能加快我們理解設計模式喲 showImg(https://segmentfault.com/img/bVbgyeK?w=500&h=375); 設計模式得存在讓系統代碼可重用、可擴展、可解耦、...
摘要:為什么要采用面向對象編程解決問題更容易設計計算機程序就是為了解決人類的問題。面向對象編程需要對業務及代碼的架構是有一定的要求的。 1. 編程方式 我們目前的編程方式大體可以有以下三種編程方式: 順序編程 過程式編程 面向對象編程 在講面向對象編程時先講一下什么是順序編程,什么是過程式編程,什么是面向對象編程: 順序編程: 就是只用一個單線程去執行一段代碼,執行過程根據代碼依次從上...
摘要:打開源碼,首先你會看到這樣的代碼結構這是一個自調用匿名函數。模式,是自執行函數的高級模式,可以非常方便的在各個匿名閉包中以全局對象調用閉包函數。 打開jQuery源碼,首先你會看到這樣的代碼結構: (function(window,undefined ){ // })(); 這是一個自調用匿名函數。什么東東呢?在第一個括號內,創建一個匿名函數;第二個括號,立即執行 為什么要創建這樣一個...
摘要:構造函數通過原型繼承了構造函數和原型,這就形成了一個鏈條,通俗的講就是原型鏈繼承。而且方法只能冒充構造函數里面的屬性和方法而無法冒充原型對象里面的屬性和方法還有最大的問題就是重復使用。 前言: 寫到這里,差不多就把OOP完結了,寫了幾篇OOP的文章,但是只是略懂皮毛,可能深入的OOP還有很多,但是我感覺寫到這里也算是差不多完結了。 繼承 繼承是面向對象比較核心的概念,其他語言可能實現...
閱讀 2655·2021-11-24 10:44
閱讀 1896·2021-11-22 13:53
閱讀 1908·2021-09-30 09:47
閱讀 3704·2021-09-22 16:00
閱讀 2433·2021-09-08 09:36
閱讀 2312·2019-08-30 15:53
閱讀 2791·2019-08-30 15:48
閱讀 977·2019-08-30 15:44