摘要:塊級作用域中的塊級作用域很有可能導致局部變量覆蓋全局變量或者局部變量泄露成全局變量。也就是局部變量與全局變量不會打架塊級作用域的出現,實際上使得獲得廣泛應用的立即執行匿名函數不再必要了。
let 和 const命令 1.let 命令
基本用法
語法類似 var,但是所聲明的變量,只在 let 命令所在的代碼塊內有效。
在 for 循環中,就非常適合使用 let 聲明變量。
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
一般使用 var 來聲明變量 i 的話,輸出的應該是10,但是因為是用 let 聲明的。所以只有在本輪才有效。
先聲明,后使用 (暫時性死區)
let 不像 var那樣會發生“變量提升”現象。所以,變量一定要在聲明后使用,否則報錯。
ES6明確規定,如果區塊中存在 let 和 const 命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會報錯。
let不允許在相同作用域內,重復聲明同一個變量。
目的
ES6規定暫時性死區和不存在變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。這樣的錯誤在ES5是很常見的,現在有了這種規定,避免此類錯誤就很容易了。
2.塊級作用域ES5中的塊級作用域很有可能導致局部變量覆蓋全局變量或者局部變量泄露成全局變量。
所以使用 let 聲明變量,可以有效的防止上面的兩種情況的產生。從而產生了幾個ES6特有的特點:
ES6允許塊級作用域的任意嵌套。
內層作用域可以定義外層作用域的同名變量。(也就是局部變量與全局變量不會打架)
(*)塊級作用域的出現,實際上使得獲得廣泛應用的立即執行匿名函數(IIFE)不再必要了。
(*)函數本身的作用域,在其所在的塊級作用域之內。
{ let a = "secret"; function f() { return a; } } f() // 報錯
上述代碼中,因為f()是在塊級作用域中,所以不能再外部調用。改進方法如下:
let f; { let a = "secret"; f = function () { return a; } } f() // "secret"
總之要保證f()的作用域范圍。
ES5的嚴格模式規定,函數只能在頂層作用域和函數內聲明,其他情況(比如if代碼塊、循環代碼塊)的聲明都會報錯。(但是構成區塊的大括號不能少)
3.const 命令const 命令也用來聲明變量,但是聲明的是常量。一旦聲明,常量的值就不能改變。(咦我在學C++嗎...)
const 的使用條件與 let相似,也要滿足上面的條件。
4.跨模塊常量// constants.js 模塊 export const A = 1; export const B = 3; export const C = 4; // test1.js 模塊 import * as constants from "./constants"; console.log(constants.A); // 1 console.log(constants.B); // 3 // test2.js 模塊 import {A, B} from "./constants"; console.log(A); // 1 console.log(B); // 3
(咦,我在學python嗎...)
5.全局對象的屬性全局對象是最頂層的對象,在瀏覽器環境指的是window對象,在Node.js指的是global對象。ES5之中,全局對象的屬性與全局變量是等價的。
這樣早成的麻煩就是很容易在不知不覺中就創建了全局變量。
所以。ES6規定:
①var命令和function命令聲明的全局變量,依舊是全局對象的屬性
②let命令、const命令、class命令聲明的全局變量,不屬于全局對象的屬性。
看完第一章趕腳ES6把javascript變得更像一些其他的編程語言如JAVA,C++。著重強調了 塊級作用域。
明天繼續...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78839.html
摘要:本文時間與日期處理實戰你肯定被坑過從屬于筆者的前端入門與最佳實踐中入門與最佳實踐系列文章。然而由于地球的不規則自轉,導致時間有誤差,因此目前已不被當作標準時間使用。而在航空上,所有使用的時間劃一規定是協調世界時。 本部分的知識圖譜請參考編程語言知識圖譜-時間與日期。showImg(https://segmentfault.com/img/remote/1460000007581725...
摘要:上下文切換上下文最直觀的表現就是代碼塊中的,通常在面向對象的編程中用到,來指代當前類生成的對應實例,與其他語言的一致。咦,是干嘛的,有沒有其他方式實現,請自行谷歌。 分享第一篇,關于 NodeJS —— Javascript 的常用知識以及如何從 Javascript 開發者過渡到 NodeJS 開發者(不會介紹具體的框架)。在讀本文前,希望你對 javascript 有一些初步的認識...
摘要:本文是重溫基礎系列文章的第七篇。系列目錄復習資料資料整理個人整理重溫基礎語法和數據類型重溫基礎流程控制和錯誤處理重溫基礎循環和迭代重溫基礎函數重溫基礎表達式和運算符重溫基礎數字本章節復習的是中的時間對象,一些處理的方法。 本文是 重溫基礎 系列文章的第七篇。今日感受:做好自律。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1.語法和數據類型...
摘要:字符的表示法允許采用形式表示一個字符,其中表示字符的碼點。方法,用來將字符的不同表示方法統一為同樣的形式,這稱為正規化。,默認參數,表示標準等價合成,返回多個簡單字符的合成字符。返回布爾值,表示參數字符串是否在原字符串的頭部。 ECMAScript6/ES6 入門 let和const命令變量的解構賦值 五、字符串的擴展 注:這章沒什么可以理解的,看過一遍就行,所以大體上我把有用的一些東...
摘要:我不是的深度用戶只是日常會遇到一些時間格式化的需求之前用的都是不過對的感到有些不舒服同事介紹過里邊用不可變數據的風格設計的所以就試試上星星很多請放心食用是項目的某個維護者開發的按照他個人想法進行了改進除了不可變性使用的工具做了更新也嘗試到時 我不是 Moment 的深度用戶, 只是日常會遇到一些時間格式化的需求,之前用的都是 Moment, 不過對 Moment 的 mutable A...
閱讀 3245·2023-04-26 01:31
閱讀 1892·2023-04-25 22:08
閱讀 3430·2021-09-01 11:42
閱讀 2823·2019-08-30 12:58
閱讀 2165·2019-08-29 18:31
閱讀 2429·2019-08-29 17:18
閱讀 3064·2019-08-29 13:01
閱讀 2552·2019-08-28 18:22