摘要:立即執(zhí)行函數(shù)表達(dá)式輸出綁定在函數(shù)表達(dá)式自身的函數(shù)中而不是所在作用域,使值為的變量只能在內(nèi)被訪問。且變量名不會污染外部作用域。作用域執(zhí)行一個非法操作來制造異常說明僅存在分句內(nèi)部。且,函數(shù)聲明可覆蓋。
立即執(zhí)行函數(shù)表達(dá)式(IIFE)
var a = 2; (function foo() { var a = 3; console.log(a);//3 })();//IIFE console.log(a);//2
輸出:3 2
foo綁定在函數(shù)表達(dá)式自身的函數(shù)中而不是所在作用域,使值為3的變量a只能在{..}內(nèi)被訪問。 且foo變量名不會污染外部作用域。
var a=2; (function IIFE(global) {//參數(shù)名為global var a=3; console.log(a);//3 console.log(global.a);//2 })(window);//將window對象的引用傳遞進(jìn)去 console.log(a);//2
輸出:3 2 2
立即執(zhí)行函數(shù)表達(dá)式的傳參版本。
//倒置代碼運(yùn)行順序 var a=2; (function iife(def) { def(window); })(function def(global) { var a=3; console.log(a);//3 console.log(global.a);//2 }); console.log(a);
輸出:3 2 2
同上。
作用域
try { undefined();//執(zhí)行一個非法操作來制造異常 } catch(err) { console.log(err);//TypeError: undefined is not a function } console.log(err);//Uncaught ReferenceError: err is not defined
說明:err僅存在catch分句內(nèi)部。
var foo=true; if(foo) { let bar=foo*2; var b = foo*3; console.log(b); console.log(bar); } console.log(b); console.log(bar);
輸出:
3
2
3
Uncaught ReferenceError: bar is not defined
let關(guān)鍵字將變量綁定到所在作用域,所以在全局作用域找不到變量bar。
for(var i=0; i<10; ++i) { console.log(i); } console.log(i);
輸出:1 2 3 4 5 6 7 8 9 10
for(let i=0; i<10; ++i) { console.log(i); } console.log(i);
輸出:1 2 3 4 5 6 7 8 9 Uncaught ReferenceError: i is not defined
var foo=true; if(foo) { var a=2; const b=3; console.log(a); console.log(b); a=3; b=4; } console.log(a); console.log(b);
輸出:2 3 Uncaught TypeError: Assignment to constant variable.
在為b賦值時直接報錯,因?yàn)閏onst的值是固定的,試圖修改會引起錯誤。
如果將b=4;注釋掉,則
輸出:2 3 3 Uncaught ReferenceError: b is not defined
const與let一樣,將變量綁定到所在作用域。
作用域提升
總結(jié):變量和函數(shù)聲明被提升到最上面,函數(shù)表達(dá)式不會被提升。
a=2; var a; console.log(a); console.log(b); var b=2; /*以上代碼相當(dāng)于 var a; var b; a=2; console.log(a); console.log(b); b=2;*/
輸出:2 undefined
var a;定義聲明在 編譯 階段進(jìn)行
a=2;賦值聲明在原地等待 執(zhí)行 階段
變量a的定義聲明var a;被提升到最上面,即 a=2 之前,所以沒有報錯undefined.
foo();//1 var foo; function foo() { console.log(1); } foo=function() { console.log(2); } /*以上代碼相當(dāng)于 function foo() { console.log(1); } foo(); foo=function() { console.log(2); }
輸出:1
函數(shù)foo的聲明var foo;被提升到最上面。
注:函數(shù)首先被提升,然后是變量。且,函數(shù)聲明可覆蓋。
代碼引用自《你不知道的JavaScript》系列,部分有更改。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/101759.html
本篇文章主要講述JS中l(wèi)et與const命令使用,通過代碼展示給各位。 let命令 基本使用 在ES6中,let命令是新增的聲明變量,與var的差異在于let無法重復(fù)聲明,且let有效只是在其命令的代碼塊內(nèi),let禁止變量出現(xiàn)變量提升現(xiàn)象,let的特點(diǎn)就是通過暫時性死區(qū)的方式來避免程序上的錯誤 代碼塊:使用{}包括起來的內(nèi)容 聲明變量:分配一個存儲空間 不可重復(fù)聲明:let聲明過后...
摘要:聲明的變量只在其所在的代碼塊內(nèi)有效。只要在聲明之前使用這些變量,就會報錯。在語法上稱為暫時性死區(qū)有時候,會不經(jīng)間遇到比較隱蔽的死區(qū),不太容易被發(fā)現(xiàn)。不允許重復(fù)聲明不允許在相同的作用域內(nèi)聲明同一個變量。一旦聲明,其值就不能再改變。 let && const let let聲明的變量只在其所在的代碼塊內(nèi)有效。 { let a = 10; } console.log(a) //R...
一、我們先說說javascript的作用域 ①全局變量-函數(shù)體外部進(jìn)行聲明 ②局部變量-函數(shù)體內(nèi)部進(jìn)行聲明 1)函數(shù)級作用域 javascript語言中局部變量不同于C#、Java等高級語言,在這些高級語言內(nèi)部,采用的塊級作用域中會聲明新的變量,這些變量不會影響到外部作用域。 而javascript則采用的是函數(shù)級作用域,也就是說js創(chuàng)建作用域的單位是函數(shù)。 例如: 在C#當(dāng)中我...
摘要:副作用,無副作用可執(zhí)行和關(guān)鍵詞。和不能像一樣同一個下聲明多次和不會像一樣變量聲明提升原因是,存在因此不能,賦值前使用變量。 showImg(https://segmentfault.com/img/bVbhPlD?w=1271&h=715); 關(guān)鍵詞: let ,const, blocking scope ,temporal dead zone,redeclaration,reassi...
摘要:前世在還未出現(xiàn)前,的世界一直是的統(tǒng)治在中用于變量聲明的關(guān)鍵字。的出現(xiàn)給帶來了塊級作用域,解決了變量提升,禁止了重復(fù)聲明變量,讓少了很多疑惑的地方。時代已經(jīng)過去了,各種特性用起來。 前世 在 const & let 還未出現(xiàn)前,JS 的世界一直是 var的統(tǒng)治 var:在JS中用于變量聲明的關(guān)鍵字。 特點(diǎn): 變量提升 只有函數(shù)作用域或者全局作用域,沒有塊級作用域 重復(fù)聲明變量 循環(huán)體重...
閱讀 2895·2021-11-24 09:39
閱讀 1157·2021-11-02 14:38
閱讀 4141·2021-09-10 11:26
閱讀 2743·2021-08-25 09:40
閱讀 2303·2019-08-30 15:54
閱讀 477·2019-08-30 10:56
閱讀 2738·2019-08-26 12:14
閱讀 3211·2019-08-26 12:13