【前端工程師手冊】JavaScript作用域拾遺

【前端工程師手冊】JavaScript作用域拾遺

昨天總結了一些作用域的知識【前端工程師手冊】JavaScript之作用域,但是發表完發現忘記了一些東西,今天拾個遺。
昨天說到了JavaScript中沒有塊級作用域,其實在es6中是有的。

es6中的塊級作用域

先舉個栗子:

var foo = true;
if (foo) {let bar = foo * 2;bar = something( bar ); console.log(bar);}console.log( bar );  // ReferenceError

這個是let最直觀的作用,在一對大括號中創建了塊級作用域,bar會在大括號中的代碼執行完畢后銷毀。
再舉個栗子:

for(var i = 1;i <= 5;i++) {setTimeout(function() {console.log(i)}, i*1000)
}
// 每隔一秒打印一個6,共打印5次

如果說這段代碼的初衷是間隔1秒打印出1、2、3、4、5的話,結果是令人大跌眼鏡的,真正的結果是每隔1秒打印一次6,打印5次.
為什么會這樣子?首先是因為閉包的原因,閉包后面再說,現在先理解為閉包是一個函數,一個能夠訪問并未在它自己內部定義的變量的函數。
OK,接下來說深層次原因。for循環完畢之后,i=6,且此時生成了5個匿名函數 function(){ console.log(i) },由于這5個匿名函數處在同一個詞法作用域中,所以他們引用同一個i,所以當他們執行時,自然而然就會打出6。
如何解決?

for(let i = 1;i <= 5;i++) {setTimeout(function() {console.log(i)}, i*1000)
}
// 間隔一秒分別打印出1、2、3、4、5

把var換成let聲明就可以了。
《你不知道的JavaScript-上卷》中解釋道:

for 循環頭部的 let 不僅將 i 綁定到了 for 循環的塊中,事實上它將其重新綁定到了循環的每一個迭代中,確保使用上一個循環迭代結束時的值重新進行賦值。

說白了就是再每次迭代內部,都會對 i 進行隱形的重新賦值,且使用的是上一個迭代結束時的值來對 i 進行重新賦值。
差不多就是這樣的:

for(let i = 1;i <= 5;i++) {let i = 上次迭代結束的isetTimeout(function() {console.log(i)}, i*1000)
}

所以5個匿名函數引用的并不是同一個i,自然就會順利的間隔一秒分別打印出1、2、3、4、5了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲開發中的數據表示

聲明&#xff1a;本文內容源自騰訊游戲學院程序公開課_服務端 一、數據表示的基礎 什么是數據表示&#xff1f; 數據是信息的載體。 數據表示是一組操作&#xff0c;可以描述、顯示、操作信息。 數據表示的要素 IDL - 接口描述語言 IDL是用來描述軟件組件接口的一種計算機語言。…

29--反轉字符串

文章目錄1.問題描述2.代碼詳情1.問題描述 編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 char[] 的形式給出。 不要給另外的數組分配額外的空間&#xff0c;你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 你可以假設數組中…

什么是臨界區

臨界區[1] 指的是一個訪問共用資源&#xff08;例如&#xff1a;共用設備或是共用存儲器&#xff09;的程序片段&#xff0c;而這些共用資源又無法同時被多個 線程 訪問的特性。當有線程進入臨界區段時&#xff0c;其他線程或是 進程 必須等待&#xff08;例如&#xff1a;bo…

BZOJ 2957 樓房重建 (分塊)

題解&#xff1a;分塊&#xff0c;然后暴力維護每一塊上升序列&#xff0c;注意是不是最長上升序列&#xff0c;二分查找第二塊中大于第一塊的最后一個上升序列中的數。 注意&#xff1a;每一塊的大小不要用√n會T掉的&#xff0c;把塊的大小設為500-600都可以&#xff08;T了一…

OpenBSD 5.1 正式版發布

OpenBSD 開發團隊于近日發布了 5.1 正式版。 OpenBSD是一個從NetBSD衍生出來的類Unix操作系統。項目領導人Theo de Raadt在1995年發起了OpenBSD項目&#xff0c;希望創造一個注重安全的操作系統&#xff0c;此外OpenBSD也以高品質的文件、堅持開放程式碼以及嚴格的軟件授權著名…

Spring事務傳播行為7種類型 --- 看一遍就能記住!

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Spring 事務傳播行為一共有7種類型&#xff0c;主要分為3類&#xff1a; 1&#xff09;支持當前事物、 2&#xff09;不支持當前事…

PowerShell變量——PowerShell三分鐘(七)

有了前面的PowerShell基礎&#xff0c;今天我們來學習一個可以極大提升PowerShell效率的用法——變量簡答來說呢&#xff0c;變量就是在內存中的一個帶有名字的盒子~~~~~你可以把所有想存放的東西都放到這個“盒子”里。然后通過名字去訪問這個盒子。在訪問過程中&#xff0c;可…

Machine Learning - Coursera week6 Evaluating a learning algorithm

Evaluating a learning algorithm 1. Design what to do next 在預測房價的學習例子&#xff0c;假如你已經完成了正則化線性回歸&#xff0c;也就是最小化代價函數J的值。假如在你得到你的學習參數以后把它應用到放到一組新的房屋樣本上進行測試&#xff0c;發現在預測房價時產…

Tiny Core Linux 4.5 發布,微型 Linux 操作系統

世界上最小的Linux桌面發行版——Tiny Core Linux 今天發布了4.5版本。Tiny Core Linux是一個基于Linux2.6版本內核&#xff0c;采用BusyBox、Tiny X、FLTK 和其它小型軟件構筑的帶圖形用戶界面的微型Linux操作系統。由于體積很小&#xff0c;大約10MB&#xff0c;故采用整體裝…

30-- 返回倒數第 k 個節點

文章目錄1.問題描述2.代碼詳情1.問題描述 實現一種算法&#xff0c;找出單向鏈表中倒數第 k 個節點。返回該節點的值。 輸入&#xff1a; 1->2->3->4->5 和 k 2 輸出&#xff1a; 4 2.代碼詳情 設置快和慢兩個指針&#xff0c;初始化時快指針比慢指針多走k-1步…

maven的web工程打包為war并部署到服務器

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.在maven工程上右鍵 --> export --> 選擇WAR file --> next 2. 點擊Browse... 選擇導出后存放位置 3. 將工程名改為ROOT.war…

使用線程池的好處

第一&#xff1a;降低資源消耗。通過重復利用已創建的線程降低線程創建和銷毀造成的消耗。第二&#xff1a;提高響應速度。當任務到達時&#xff0c;任務可以不需要等到線程創建就能立即執行。第三&#xff1a;提高線程的可管理性。線程是稀缺資源&#xff0c;如果無限制的創建…

5.19 - Stacks and Queues

Decode Stringk[encoded_string] 的編碼字符串&#xff0c;將編碼的字符重復k次&#xff0c;最后打印出一個完整的字符串。 思路&#xff1a;使用棧結構&#xff0c;由里層向外層&#xff0c;層層解碼&#xff0c;當遇到了[ 字符時&#xff0c;向stack當中添加元素&#xff0c;…

Hive筆記之嚴格模式(strict mode)

Hive有一個嚴格模式&#xff0c;在嚴格模式下會對可能產生較大查詢結果的語句做限制&#xff0c;禁止其提交執行。 一、切換嚴格模式 查看當前的模式&#xff1a;hive> set hive.mapred.mode; hive.mapred.mode is undefined 未定義即為false&#xff0c;即no-strict模式。 …

Notepad++ 6.0 發布,優化了大文件加載性能

開源編輯器Notepad今天發布了最新的6.0版本。 Notepad 是一款免費的開源跨平臺代碼編輯器。它支持包括中文在內的多國語言&#xff0c;功能強大&#xff0c;除了可以用來制作一般的純文字說明文件外&#xff0c;也可以作為代碼編輯器。Notepad不僅可以實現語法高亮顯示&#x…

31-- 二叉搜索樹的范圍和

文章目錄1.問題描述2.代碼詳情1.問題描述 給定二叉搜索樹的根結點 root&#xff0c;返回 L 和 R&#xff08;含&#xff09;之間的所有結點的值的和。 二叉搜索樹保證具有唯一的值。 示例 1&#xff1a; 輸入&#xff1a;root [10,5,15,3,7,null,18], L 7, R 15 輸出&…

java中 flush()方法

一般主要用在IO中&#xff0c;即清空緩沖區數據&#xff0c;就是說你用讀寫流的時候&#xff0c;其實數據是先被讀到了內存中&#xff0c;然后用數據寫到文件中&#xff0c;當你數據讀完的時候不代表你的數據已經寫完了&#xff0c;因為還有一部分有可能會留在內存這個緩沖區中…

JDK下載地址、SecureCRT中JDK安裝和環境配置、SecureCRT窗口編程、linux下命令運行小程序

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 下載linux版本的JDK。java SE、java EE JDK是通用的&#xff0c; 32位系統選Linux x86&#xff0c; 64位系統選Linux x64&#xff…

HTMLTestRunner 漢化版---來源一個大神的源碼(加了失敗截圖,用例失敗重新執行 功能)...

HTMLTestRunner 漢化版 20170925 測試報告完全漢化&#xff0c;包括錯誤日志的中文處理針對selenium UI測試增加失敗自動截圖功能增加失敗自動重試功能增加餅圖統計同時兼容python2.x 和3.x20180402 表格樣式優化修復部分bug增加截圖組&#xff0c;可展示多張截圖&#xff0c;首…

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilder

一.問題描述&#xff1a;pom.xml導入依賴時報錯 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilder 二.解決方法&#xff1a; 1.加入ali鏡像源 <repositories><repository><id>maven-ali</id><url>https://mave…