摘要:立即執(zhí)行函數(shù)表達(dá)式輸出綁定在函數(shù)表達(dá)式自身的函數(shù)中而不是所在作用域,使值為的變量只能在內(nèi)被訪問(wèn)。且變量名不會(huì)污染外部作用域。作用域執(zhí)行一個(gè)非法操作來(lái)制造異常說(shuō)明僅存在分句內(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)被訪問(wèn)。 且foo變量名不會(huì)污染外部作用域。
var a=2; (function IIFE(global) {//參數(shù)名為global var a=3; console.log(a);//3 console.log(global.a);//2 })(window);//將window對(duì)象的引用傳遞進(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í)行一個(gè)非法操作來(lái)制造異常 } catch(err) { console.log(err);//TypeError: undefined is not a function } console.log(err);//Uncaught ReferenceError: err is not defined
說(shuō)明: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賦值時(shí)直接報(bào)錯(cuò),因?yàn)閏onst的值是固定的,試圖修改會(huì)引起錯(cuò)誤。
如果將b=4;注釋掉,則
輸出:2 3 3 Uncaught ReferenceError: b is not defined
const與let一樣,將變量綁定到所在作用域。
作用域提升
總結(jié):變量和函數(shù)聲明被提升到最上面,函數(shù)表達(dá)式不會(huì)被提升。
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 之前,所以沒(méi)有報(bào)錯(cuò)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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/101759.html
本篇文章主要講述JS中l(wèi)et與const命令使用,通過(guò)代碼展示給各位?! et命令 基本使用 在ES6中,let命令是新增的聲明變量,與var的差異在于let無(wú)法重復(fù)聲明,且let有效只是在其命令的代碼塊內(nèi),let禁止變量出現(xiàn)變量提升現(xiàn)象,let的特點(diǎn)就是通過(guò)暫時(shí)性死區(qū)的方式來(lái)避免程序上的錯(cuò)誤 代碼塊:使用{}包括起來(lái)的內(nèi)容 聲明變量:分配一個(gè)存儲(chǔ)空間 不可重復(fù)聲明:let聲明過(guò)后...
摘要:聲明的變量只在其所在的代碼塊內(nèi)有效。只要在聲明之前使用這些變量,就會(huì)報(bào)錯(cuò)。在語(yǔ)法上稱為暫時(shí)性死區(qū)有時(shí)候,會(huì)不經(jīng)間遇到比較隱蔽的死區(qū),不太容易被發(fā)現(xiàn)。不允許重復(fù)聲明不允許在相同的作用域內(nèi)聲明同一個(gè)變量。一旦聲明,其值就不能再改變。 let && const let let聲明的變量只在其所在的代碼塊內(nèi)有效。 { let a = 10; } console.log(a) //R...
一、我們先說(shuō)說(shuō)javascript的作用域 ?、偃肿兞?函數(shù)體外部進(jìn)行聲明 ②局部變量-函數(shù)體內(nèi)部進(jìn)行聲明 1)函數(shù)級(jí)作用域 javascript語(yǔ)言中局部變量不同于C#、Java等高級(jí)語(yǔ)言,在這些高級(jí)語(yǔ)言內(nèi)部,采用的塊級(jí)作用域中會(huì)聲明新的變量,這些變量不會(huì)影響到外部作用域?! 《鴍avascript則采用的是函數(shù)級(jí)作用域,也就是說(shuō)js創(chuàng)建作用域的單位是函數(shù)。 例如: 在C#當(dāng)中我...
摘要:副作用,無(wú)副作用可執(zhí)行和關(guān)鍵詞。和不能像一樣同一個(gè)下聲明多次和不會(huì)像一樣變量聲明提升原因是,存在因此不能,賦值前使用變量。 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)給帶來(lái)了塊級(jí)作用域,解決了變量提升,禁止了重復(fù)聲明變量,讓少了很多疑惑的地方。時(shí)代已經(jīng)過(guò)去了,各種特性用起來(lái)。 前世 在 const & let 還未出現(xiàn)前,JS 的世界一直是 var的統(tǒng)治 var:在JS中用于變量聲明的關(guān)鍵字。 特點(diǎn): 變量提升 只有函數(shù)作用域或者全局作用域,沒(méi)有塊級(jí)作用域 重復(fù)聲明變量 循環(huán)體重...
閱讀 2982·2021-11-24 09:39
閱讀 1266·2021-11-02 14:38
閱讀 4313·2021-09-10 11:26
閱讀 2852·2021-08-25 09:40
閱讀 2386·2019-08-30 15:54
閱讀 559·2019-08-30 10:56
閱讀 2864·2019-08-26 12:14
閱讀 3299·2019-08-26 12:13