摘要:先來(lái)看一個(gè)問(wèn)題題目前端當(dāng)然這里輸出的是結(jié)果是前端如果現(xiàn)在將變成那么輸出的結(jié)果就會(huì)變成解答其實(shí)這題并不是很難,第一句其實(shí)是定義了兩個(gè)全局的變量,在利用的閉包內(nèi)用重新定義了而沒(méi)有重新定義我們知道在默認(rèn)情況下如果不用定義的變量都會(huì)變成全局變量,所
先來(lái)看一個(gè)問(wèn)題 題目
var str1 = str2 = "web"; (function () { var str1 = str2 = "前端"; })(); console.log(str2);
當(dāng)然這里輸出的是結(jié)果是: 前端
如果現(xiàn)在將console.log(str2)變成consloe.log(str1),那么輸出的結(jié)果就會(huì)變成 web
解答其實(shí)這題并不是很難,第一句 var str1 = str2 = "web"; 其實(shí)是定義了兩個(gè)全局的變量,在利用function的閉包內(nèi)用 var 重新定義了 str1 而沒(méi)有重新定義 str2
我們知道在默認(rèn)情況下 如果不用 var 定義的變量都會(huì)變成全局變量,所以此時(shí)在function閉包內(nèi)的str2就是引用了全局變量,所以賦值操作當(dāng)然也就能賦予全局變量 str2 所以輸出 str2 結(jié)果是 "前端"
而 str1 用了 var 定義,就是在function閉包內(nèi)的變量,閉包外自然不可以改變,所以輸出的結(jié)果是 "web"
腦洞大開(kāi)其實(shí)每一次看到這種形式的代碼
(function(){ })()
都覺(jué)得非常的新鮮,覺(jué)得這里有很多東西可以專研,所以在這里也總結(jié)一下這種形式的閉包。
解釋前先看看首先這種形式的閉包是人為的加上去,并不是說(shuō)可以有什么神奇的 duangduang 的特效,而是可以避免很多本來(lái)是局部變量可以搞定的比較 low 的變量去污染全局的變量
其次在js中,是 沒(méi)有塊作用域 這種說(shuō)法
首先我們回到C++,如果有一段代碼是這樣
int number1=10; if(true){ int number1 = 5; } cout<這里的結(jié)果還是 10
而在js代碼之中
var str1= "web"; if(true){ var str1="前端"; }; console.log(str1);這里的結(jié)果就是 前端
因?yàn)?if{} 沒(méi)有塊作用域,所以內(nèi)部的str1直接就重定義了外部全局的str1,所以輸出的結(jié)果就只是"前端"了,而且這也污染了全局變量(那個(gè)等于"web"的str1已經(jīng)不見(jiàn)了蹤影)
而大 js 只有 函數(shù)作用域
所以我們要利用函數(shù)閉包利用函數(shù)閉包能有效的封裝局部的變量,而不污染全局作用域
str1 = "web"; (function () { var str1 = "前端"; //str1剩下的功能 )(); console.log(str1);此時(shí)輸出的還是 web
所以我們利用了一個(gè)匿名函數(shù) function(){} 并且讓他自己調(diào)用自己執(zhí)行函數(shù)內(nèi)部的操作 并且 str1 也沒(méi)有污染到外部的全局作用域
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/80595.html
摘要:忍者秘籍一書(shū)中,對(duì)于柯里化的定義如下在一個(gè)函數(shù)中首先填充幾個(gè)參數(shù)然后再返回一個(gè)新函數(shù)的技術(shù)稱為柯里化?;氐轿覀兊念}目本身,其實(shí)根據(jù)測(cè)試用例我們可以發(fā)現(xiàn),函數(shù)的要求就是接受單一函數(shù),例如但是與柯里化不同之處在于,柯里化返回的一個(gè)新函數(shù)。 歡迎大家再一次來(lái)到我的文章專欄:從面試題中我們能學(xué)到什么,各位同行小伙伴是否已經(jīng)開(kāi)始了悠閑的春節(jié)假期呢?在這里提前祝大家雞年大吉吧~哈哈,之前有人說(shuō)...
摘要:箭頭函數(shù)與傳統(tǒng)函數(shù)的區(qū)別,主要集中在以下方面沒(méi)有和綁定,這些值由最近一層非箭頭函數(shù)決定。不能通過(guò)關(guān)鍵字調(diào)用,所以不能用作構(gòu)造函數(shù),否則程序會(huì)拋出錯(cuò)誤。聲明的全局變量不是全局對(duì)象的屬性。 showImg(https://segmentfault.com/img/remote/1460000013229911?w=2402&h=1398); 本文首發(fā)于我的博客:http://blog.du...
摘要:箭頭函數(shù)與傳統(tǒng)函數(shù)的區(qū)別,主要集中在以下方面沒(méi)有和綁定,這些值由最近一層非箭頭函數(shù)決定。不能通過(guò)關(guān)鍵字調(diào)用,所以不能用作構(gòu)造函數(shù),否則程序會(huì)拋出錯(cuò)誤。聲明的全局變量不是全局對(duì)象的屬性。 showImg(https://segmentfault.com/img/remote/1460000013229911?w=2402&h=1398); 本文首發(fā)于我的博客:http://blog.du...
摘要:箭頭函數(shù)與傳統(tǒng)函數(shù)的區(qū)別,主要集中在以下方面沒(méi)有和綁定,這些值由最近一層非箭頭函數(shù)決定。不能通過(guò)關(guān)鍵字調(diào)用,所以不能用作構(gòu)造函數(shù),否則程序會(huì)拋出錯(cuò)誤。聲明的全局變量不是全局對(duì)象的屬性。 showImg(https://segmentfault.com/img/remote/1460000013229911?w=2402&h=1398); 本文首發(fā)于我的博客:http://blog.du...
答案自己谷歌或百度找。 一、來(lái)源背景 面試題是來(lái)自微博@??途W(wǎng)發(fā)布的真實(shí)大廠前端面經(jīng)題目,我一直在收集題目長(zhǎng)期一個(gè)一個(gè)的記錄下來(lái)的,可能會(huì)有重復(fù),但基本前端的面試大綱和需要掌握的知識(shí)都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識(shí)鏈。 二、532道前端真實(shí)大廠面試題 express和koa的對(duì)比,兩者中間件的原理,koa捕獲異常多種情...
閱讀 967·2021-10-13 09:39
閱讀 3637·2021-09-26 10:16
閱讀 2963·2019-08-30 15:54
閱讀 1114·2019-08-30 14:22
閱讀 2950·2019-08-29 15:39
閱讀 3354·2019-08-27 10:52
閱讀 863·2019-08-26 13:59
閱讀 1837·2019-08-26 12:20