函數(shù)作用域和塊作用域

函數(shù)中的作用域

function foo(a) {

var b = 2;

// 一些代碼

function bar() {

// ...

}

// 更多的代碼

var c = 3; }

分析上述代碼了解函數(shù)作用域知識(shí)點(diǎn)。

1 .foo(..) 的作用域氣泡中包含了標(biāo)識(shí)符 a、b、c 和 bar

2.全局作用域只包含 foo? 說明 foo() 包含 于標(biāo)識(shí)符 a、b、c 和 bar? 因此無法從foo 外部對(duì)他們進(jìn)行訪問,也就是說無法從全局作用域來訪問,只能在內(nèi)部訪問問(假設(shè) bar(..) 內(nèi)部沒有同名的標(biāo)識(shí)符聲明)。 例如 bar() 這樣訪問就會(huì)報(bào)錯(cuò)!

隱藏內(nèi)部實(shí)現(xiàn)

直觀看就是 {//代碼} 在2個(gè)大括號(hào)之間的代碼就被隱藏起來了。

1. 內(nèi)容私有化

2. 規(guī)避沖突

? ?規(guī)避沖突大致2種實(shí)現(xiàn)方法?

? ? ? 1.全局命名空間

? ? ? var MyReallyCoolLibrary = {

? ? ? ? ? awesome: "stuff",

? ? ? ? ? ?doSomething: function() {

? ? ? ? ? ? ? ?// ...

? ? ? ? ? },

? ? ? ? }

? ? ? 2. 模塊管理?

函數(shù)作用域

在任意代碼片段外部添加包裝函數(shù),可以將內(nèi)部的變量和函數(shù)定義“隱藏”起來,外部作用域無法訪問包裝函數(shù)內(nèi)部的任何內(nèi)容。

匿名函數(shù)

一般回調(diào)函數(shù)用的多。

例如 : setTimeout(function(){});

匿名函數(shù)表達(dá)式,沒有名稱標(biāo)識(shí)符。、

缺點(diǎn)

1. 匿名函數(shù)在棧追蹤中不會(huì)顯示出有意義的函數(shù)名,使得調(diào)試很困難。

2. 匿名函數(shù)無法引用自身進(jìn)行遞歸。只能用過期的 arguments.callee 在事件觸發(fā)后事件監(jiān)聽器需要解綁.

3. 匿名函數(shù)省略了對(duì)于代碼可讀性

setTimeout( function timeoutHandler() { // <-- 快看,我有名字了!

console.log( "I waited 1 second!" );

}, 1000 );

立即執(zhí)行函數(shù)表達(dá)式

例子 :

(function foo() {

console.log(3); // 3

})();

一個(gè)()內(nèi) 函數(shù) 為函數(shù)表達(dá)式 ?

(function foo() {

console.log(3); // 3

})

(//函數(shù))() ?立即執(zhí)行。

另一種方式

(function foo(){}());

UMD通用規(guī)范

(function IIFE( def ) {

if (typeof define === 'function' && define.amd) {

// AMD

define([],def);

} else if (typeof exports === 'object') {

// Node, CommonJS之類的

module.exports = factory(require('def'));

} else {

// 瀏覽器全局變量(root 即 window)

root.returnExports = factory(def);

}

})(function def( global ) {

var a = 3;

console.log( a ); // 3

console.log( global.a ); // 2

});

塊作用域?

最常見的塊級(jí)作用域

for (var i=0; i<10; i++) {

console.log( i );

}

var bar=true

if(bar){

//代碼

}

為什么要把一個(gè)只在 for 循環(huán)內(nèi)部使用(至少是應(yīng)該只在內(nèi)部使用)的變量 i 污染到整個(gè)函數(shù)作用域中呢?

with 和 ?try/catch

非常少有人會(huì)注意到 JavaScript 的 ES3 規(guī)范中規(guī)定 try/catch 的 catch 分句會(huì)創(chuàng)建一個(gè)塊作用域,其中聲明的變量?jī)H在 catch 內(nèi)部有效。

try {

undefined(); // 執(zhí)行一個(gè)非法操作來強(qiáng)制制造一個(gè)異常

}

catch (err) {

console.log( err ); // 能夠正常執(zhí)行!

}

console.log( err ); // ReferenceError: err not found

let? const

屬于ES6知識(shí)?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容