亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

掌握J(rèn)avascript面試:什么是閉包?

jifei / 3550人閱讀

摘要:我的意思是大多數(shù)稱職的面試官會(huì)問你什么是閉包,并且在大多數(shù)時(shí)候你回答錯(cuò)誤將失去這份工作。在閉包的范圍內(nèi)定義的任何公開方法都是特權(quán)的。使對(duì)象的數(shù)據(jù)私有化并不是閉包的唯一用途。

文章來源于:https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-closure-b2f0d2152b36

在JavaScript的面試中我通常將這個(gè)問題放在第一個(gè)或者最后一個(gè)問題。坦白地說,如果你沒有深入的學(xué)習(xí)閉包你的JavaScript不可能有很深的造詣。

你可能JavaScript稍好點(diǎn)兒,但你真的理解如何構(gòu)建一個(gè)好的JavaScript應(yīng)用嗎?你真的理解什么正在運(yùn)行,或者應(yīng)用如何工作的嗎?我對(duì)此表示懷疑。不知道這個(gè)問題的答案在面試的過程中是一個(gè)危險(xiǎn)的信號(hào)。

你不僅應(yīng)該知道閉包的工作機(jī)制是什么,你還應(yīng)該知道他為什么發(fā)生,并且你應(yīng)該很輕松的回答幾種常用的閉包用例。

閉包常用在JavaScript對(duì)象的數(shù)據(jù)私有化,事件句柄,回調(diào)函數(shù),和在局部應(yīng)用,柯里化,以及其他功能的變成形式。

我不在乎面試候選人是否知道‘closure’這個(gè)詞語或者技術(shù)定義。我想要弄明白的是他們是否理解基本的運(yùn)行機(jī)制。如果他們不知道,顯而易見這些面試候選者并沒有大量的實(shí)際JavaScript應(yīng)用開發(fā)經(jīng)驗(yàn)。

“如果你不能回答這個(gè)問題,你就是一個(gè)初級(jí)開發(fā)人員。我不管你工作了幾年?!?/pre>

這聽起來意味著什么,但實(shí)際上并不是。我的意思是大多數(shù)稱職的面試官會(huì)問你什么是閉包,并且在大多數(shù)時(shí)候你回答錯(cuò)誤將失去這份工作。如果你足夠幸運(yùn)的話,你將得到一個(gè)offer,他們將給你一個(gè)初級(jí)開發(fā)人員的工資而不是一個(gè)高級(jí)的開發(fā)人員。

準(zhǔn)備好快速跟進(jìn):“你能說出兩種常用的閉包嗎?”

什么是閉包?

閉包就是一個(gè)函數(shù)(封閉的)的集合引用的環(huán)境(詞法環(huán)境)狀態(tài)。換句話說,閉包有能力從一個(gè)內(nèi)部函數(shù)訪問外部函數(shù)的作用域。在JavaScript中,在函數(shù)被創(chuàng)建時(shí),每次一個(gè)函數(shù)被創(chuàng)建閉包也被創(chuàng)建。

用一個(gè)閉包,只需在一個(gè)函數(shù)內(nèi)部定義一個(gè)函數(shù),暴露這個(gè)內(nèi)部的函數(shù),然后返回這個(gè)函數(shù),或者把它傳遞給另一個(gè)函數(shù)。內(nèi)部的函數(shù)將有能力訪問外部函數(shù)作用域的變量,即使外部的函數(shù)有返回值

使用閉包(實(shí)例)

刨除其他的,閉包通常用于對(duì)象的數(shù)據(jù)私有化。數(shù)據(jù)的私有化是幫助我們開發(fā)接口的一個(gè)重要的屬性,而不是實(shí)現(xiàn)(應(yīng)用的開發(fā)的細(xì)節(jié)實(shí)現(xiàn))。他是一個(gè)幫助我們開發(fā)一個(gè)穩(wěn)健的軟件的重要概念,因?yàn)閷?shí)現(xiàn)細(xì)節(jié)往往比接口約定更容易被打破。

“程序之于接口,而不是實(shí)現(xiàn)”

設(shè)計(jì)模式:可重用的面向?qū)ο筌浖脑?/p>

在javascript中閉包是的主要機(jī)制就是被用來實(shí)現(xiàn)數(shù)據(jù)的私有化。當(dāng)你用筆包進(jìn)行數(shù)據(jù)的私有化,所包含的變量僅被包含在在外部的函數(shù)作用域內(nèi)。除了通過對(duì)象的特權(quán)方法外,你將不能從外部范圍獲取數(shù)據(jù)。在閉包的范圍內(nèi)定義的任何公開方法都是特權(quán)的。例如:

const getSecret = (secret) => {
  return {
    get: () => secret
  };
};

test("Closure for object privacy.", assert => {
  const msg = ".get() should have access to the closure.";
  const expected = 1;
  const obj = getSecret(1);

  const actual = obj.get();

  try {
    assert.ok(secret, "This throws an error.");
  } catch (e) {
    assert.ok(true, `The secret var is only available
      to privileged methods.`);
  }

  assert.equal(actual, expected, msg);
  assert.end();
});

在上面的例子中,‘.get()’方法是在‘getsecret()’范圍內(nèi)定義的,這使得它可以從‘getsecret()’訪問任何變量,并使它 成為一個(gè)特權(quán)方法。

使對(duì)象的數(shù)據(jù)私有化并不是閉包的唯一用途。它也可以用來創(chuàng)建有狀態(tài)的函數(shù),這些函數(shù)的返回值可能受他們內(nèi)部狀態(tài)的影響。示例如下:

const secret = msg => () => msg;

// Secret - creates closures with secret messages.
// https://gist.github.com/ericelliott/f6a87bc41de31562d0f9
// https://jsbin.com/hitusu/edit?html,js,output

// secret(msg: String) => getSecret() => msg: String
const secret = (msg) => () => msg;

test("secret", assert => {
  const msg = "secret() should return a function that returns the passed secret.";

  const theSecret = "Closures are easy.";
  const mySecret = secret(theSecret);

  const actual = mySecret();
  const expected = theSecret;

  assert.equal(actual, expected, msg);
  assert.end();
});

在函數(shù)式編程中,閉包常常被用在局部應(yīng)用&柯里化編程,這里需要明白一些定義:

應(yīng)用程序:應(yīng)用一個(gè)函數(shù)的參數(shù)已返回一個(gè)值得過程

部分應(yīng)用:函數(shù)應(yīng)用他的部分參數(shù)的過程,這個(gè)部分被應(yīng)用的函數(shù)稍后被用來獲得返回值。換句話來說,一個(gè)函數(shù)轉(zhuǎn)變一個(gè)多參數(shù)的函數(shù),并利用它的返回一個(gè)少參數(shù)的函數(shù)。

部分應(yīng)用利用閉包的作用域來處理參數(shù)對(duì)象,你可以寫一個(gè)泛型函數(shù)部分的將參數(shù)應(yīng)用于目標(biāo)函數(shù),下面有一個(gè)示例:

partialApply(targetFunction: Function, ...fixedArgs: Any[]) =>
      functionWithFewerParams(...remainingArgs: Any[])

它將接受一個(gè)帶有任意數(shù)量參數(shù)的函數(shù),接下來我們想要部分的應(yīng)用函數(shù)的參數(shù)然后返回一個(gè)帶有剩余參數(shù)的函數(shù)。

下面一個(gè)例子,一個(gè)求兩個(gè)數(shù)字和的函數(shù):

const add = (a, b) => a + b;

現(xiàn)在你想要一個(gè)實(shí)現(xiàn)對(duì)任意數(shù)字都加10的函數(shù),我們命名它為‘a(chǎn)dd10()’?!產(chǎn)dd10(5)’的結(jié)果應(yīng)該是‘15’,我們頂一個(gè)‘partialAply()’的函數(shù),如下:

const add10 = partialApply(add, 10);
add10(5);

在這個(gè)例子中,參數(shù)‘10’變成了一個(gè)固定的參數(shù)被保存在‘a(chǎn)dd10()’的閉包作用域中。
下面是‘partialApply()’的實(shí)現(xiàn)代碼:

// Generic Partial Application Function
// https://jsbin.com/biyupu/edit?html,js,output
// https://gist.github.com/ericelliott/f0a8fd662111ea2f569e

// partialApply(targetFunction: Function, ...fixedArgs: Any[]) =>
//   functionWithFewerParams(...remainingArgs: Any[])
const partialApply = (fn, ...fixedArgs) => {
  return function (...remainingArgs) {
    return fn.apply(this, fixedArgs.concat(remainingArgs));
  };
};


test("add10", assert => {
  const msg = "partialApply() should partially apply functions"

  const add = (a, b) => a + b;

  const add10 = partialApply(add, 10);


  const actual = add10(5);
  const expected = 15;

  assert.equal(actual, expected, msg);
});

正如我們從上面的示例中看到的,這個(gè)簡(jiǎn)單的返回函數(shù)可以訪問‘fixArgs’參數(shù),這個(gè)參數(shù)是從‘partialApply()’中傳入的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/90388.html

相關(guān)文章

  • 還擔(dān)心面試官問閉包?

    摘要:一言以蔽之,閉包,你就得掌握。當(dāng)函數(shù)記住并訪問所在的詞法作用域,閉包就產(chǎn)生了。所以閉包才會(huì)得以實(shí)現(xiàn)。從技術(shù)上講,這就是閉包。執(zhí)行后,他的內(nèi)部作用域并不會(huì)消失,函數(shù)依然保持有作用域的閉包。 網(wǎng)上總結(jié)閉包的文章已經(jīng)爛大街了,不敢說筆者這篇文章多么多么xxx,只是個(gè)人理解總結(jié)。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結(jié)與《JavaScript忍者秘籍》 《你不知道的JavaScri...

    tinyq 評(píng)論0 收藏0
  • 快速掌握JavaScript面試基礎(chǔ)知識(shí)(二)

    摘要:第一部分請(qǐng)點(diǎn)擊快速掌握面試基礎(chǔ)知識(shí)一閉包閉包由一個(gè)函數(shù)以及該函數(shù)定義是所在的環(huán)境組成。當(dāng)匿名函數(shù)執(zhí)行的時(shí)候,的值為。這個(gè)問題可以改用后面會(huì)介紹方法來解決,通過對(duì)每一個(gè)匿名函數(shù)構(gòu)建獨(dú)立的外部作用域來實(shí)現(xiàn)。 譯者按: 總結(jié)了大量JavaScript基本知識(shí)點(diǎn),很有用! 原文: The Definitive JavaScript Handbook for your next develope...

    fyber 評(píng)論0 收藏0
  • 【譯】理解JavaScript閉包

    摘要:當(dāng)面試中讓我解釋一下閉包時(shí)我懵逼了。這個(gè)解釋開始可能有點(diǎn)晦澀,讓我們抽絲剝繭摘下閉包的真面目。此文不詳述作用域有專門的主題闡述,不過作用域是理解閉包原理的基礎(chǔ)。這才是閉包的真正便利之處。閉包使用不當(dāng)就會(huì)很坑。 原文鏈接 為什么深度學(xué)習(xí)JavaScript? JavaScript如今是最流行的編程語言之一。它運(yùn)行在瀏覽器、服務(wù)器、移動(dòng)設(shè)備、桌面應(yīng)用,也可能包括冰箱。無需我舉其他再多不相干...

    岳光 評(píng)論0 收藏0
  • 那些年,前端學(xué)習(xí)之路的疑難雜癥(四):面試中遇到的3個(gè)問題概覽

    摘要:閉包能用來實(shí)現(xiàn)私有化和創(chuàng)建工廠函數(shù)等作用。關(guān)于閉包的常見面試題是這樣的寫一個(gè)函數(shù),循環(huán)一個(gè)整數(shù)數(shù)組,延遲秒打印這個(gè)數(shù)組中每個(gè)元素的索引。 文章來源:http://mp.weixin.qq.com/s/vs0... 前言 在公眾號(hào)上看到了這篇文章,覺得很有用,有助于理解JS學(xué)習(xí)中的一些重點(diǎn)難點(diǎn)。決定把它整理下發(fā)布出來。該文章主要介紹了JS中的三個(gè)問題。在以后的幾篇文章里,我會(huì)詳細(xì)介紹這三...

    gecko23 評(píng)論0 收藏0
  • JS筆記

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個(gè)方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識(shí)之 HTTP 協(xié)議 詳細(xì)介紹 HTT...

    rottengeek 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<