奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

JavaScript

正確理解Javascript閉包

時間:2024-07-07 23:50:02 JavaScript 我要投稿
  • 相關推薦

正確理解Javascript閉包

  正確理解Javascript閉包

  閉包是ECMAScript一個很重要的特征,但是卻很難用合適的定義來描述它。雖然閉包很難清晰地描述,但是,卻很容易創(chuàng)建,或者說,不小心創(chuàng)建。然而,閉包的存在其實是有一定的潛在問題的。為了避免“不小心”地創(chuàng)建閉包,以及更好地利用閉包的優(yōu)點,有必要理解閉包的機制。

  閉包的定義

  關于閉包,有太多的定義,特別是有一些定義非常抽象,象這個:

  A "closure" is an expression (typically a function) that can have free variables together with an environment that binds those variables.

  大致是說閉包是一個表達式,擁有一些自由變量及綁定這些變量的執(zhí)行環(huán)境。這種定義太書面化,反而難以理解。

  還有另一個定義:

  所有函數(shù)都是閉包。這個定義給我很大的迷惑,換句話說,由于Javascript沒有塊級作用域,因此閉包一般指的是函數(shù)(想不出除了函數(shù)以外還有哪些方式可以構成閉包)。

  這里不想太多討論函數(shù)與閉包的關系,下面給出我認為比較容易理解的定義吧。

  首先,閉包的存在是基于作用域鏈。由于作用域鏈的機制,所有函數(shù)(即使全局函數(shù))都能引用上下文執(zhí)行環(huán)境中的變量(即free variables)。

  其次,閉包內(nèi)部必須有free variables。順便說下兩種變量1. Local variables (bound variables) 2. Non-local variables (free variables)

  最后,在其上下文環(huán)境結束后仍然存在。即內(nèi)部函數(shù)擁有比它的外部函數(shù)更長的生命周期。

  關于閉包定義的解析

  關于閉包定義的兩點,一直在考慮是不是必須同時滿足。

  首先,如果閉包內(nèi)部沒有free variables,即是說它沒有訪問外部的變量,那么就失去了閉包的意義。(除非通過其他閉包改變了行為)因此,我認為free variables是必要條件。

  其次,如果函數(shù)內(nèi)部存在free variables,但是當其上下文環(huán)境銷毀后,它也跟著銷毀。可以想象內(nèi)部函數(shù),雖然訪問了其外部函數(shù)變量,但是當外部函數(shù)執(zhí)行完后也隨之回收。這種情況下,閉包的討論也沒有意義。

  來看兩個例子:

  復制代碼 代碼如下:

  var objectA = (function() {

  var localA = "localA";

  innerFn();

  // 單純的內(nèi)部函數(shù)調(diào)用

  function innerFn() {

  localA = "innerChange";

  }

  return {

  getLocalA : function() {

  return "empty";

  }

  };

  })();

  objectA.getLocalA();

  objectA.getLocalA = function() {

  return localA;

  };

  //console.log(objectA.getLocalA()); //error: localA is not defined

  var objectB = (function() {

  var localB = "localB";

  return {

  getLocalB : function() {

  return "empty";

  },

  updateGetLocalB : function() {

  this.getLocalB = function() {

  return localB;

  };

  },

  updateLocalB : function() {

  localB = "changeLocalB";

  }

  };

  })();

  console.log(objectB.getLocalB()); // empty

  // 通過其他閉包改變

  objectB.updateGetLocalB();

  console.log(objectB.getLocalB()); // localB

  objectB.updateLocalB();

  console.log(objectB.getLocalB()); // changeLocalB

  閉包的優(yōu)點和缺點

  閉包的優(yōu)點是閉包內(nèi)部可以訪問到定義它們的外部函數(shù)的參數(shù)和變量(除了this和arguments)。

  閉包主要的問題便是它會保存包含它的函數(shù)的作用域,因此比一般函數(shù)占用更多的內(nèi)存空間,因此不宜過度使用閉包。

  閉包的應用

  閉包最基本的應用場景便是通過保護內(nèi)部變量從而實現(xiàn)私有,比如模塊模式。

  

【正確理解Javascript閉包】相關文章:

如何調(diào)試javascript腳本呢07-19

javascript跨域訪問的方法07-19

長條粽子怎么包06-11

三角粽子的包法06-08

2023幼兒大班冬至教案包餃子活動(通用11篇)10-25

主站蜘蛛池模板: 金湖县| 太康县| 合肥市| 新干县| 醴陵市| 吉安市| 柘城县| 年辖:市辖区| 佳木斯市| 维西| 玉门市| 临猗县| 浠水县| 马尔康县| 集贤县| 米林县| 改则县| 古田县| 栾川县| 建瓯市| 松原市| 瑞丽市| 洛南县| 长阳| 札达县| 潢川县| 马尔康县| 乌拉特后旗| 阿鲁科尔沁旗| 利辛县| 宜州市| 赣州市| 乐陵市| 松潘县| 武邑县| 嘉义县| 体育| 什邡市| 玉田县| 安顺市| 晋城|