函數(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? 說(shuō)明 foo() 包含 于標(biāo)識(shí)符 a、b、c 和 bar? 因此無(wú)法從foo 外部對(duì)他們進(jìn)行訪問(wèn),也就是說(shuō)無(wú)法從全局作用域來(lái)訪問(wèn),只能在內(nèi)部訪問(wèn)問(wèn)(假設(shè) bar(..) 內(nèi)部沒(méi)有同名的標(biāo)識(shí)符聲明)缀辩。 例如 bar() 這樣訪問(wèn)就會(huì)報(bào)錯(cuò)!
隱藏內(nèi)部實(shí)現(xiàn)
直觀看就是 {//代碼} 在2個(gè)大括號(hào)之間的代碼就被隱藏起來(lái)了踪央。
1. 內(nèi)容私有化
2. 規(guī)避沖突
? ?規(guī)避沖突大致2種實(shí)現(xiàn)方法?
? ? ? 1.全局命名空間
? ? ? var MyReallyCoolLibrary = {
? ? ? ? ? awesome: "stuff",
? ? ? ? ? ?doSomething: function() {
? ? ? ? ? ? ? ?// ...
? ? ? ? ? },
? ? ? ? }
? ? ? 2. 模塊管理?
函數(shù)作用域
在任意代碼片段外部添加包裝函數(shù)臀玄,可以將內(nèi)部的變量和函數(shù)定義“隱藏”起來(lái),外部作用域無(wú)法訪問(wèn)包裝函數(shù)內(nèi)部的任何內(nèi)容畅蹂。
匿名函數(shù)
一般回調(diào)函數(shù)用的多健无。
例如 : setTimeout(function(){});
匿名函數(shù)表達(dá)式,沒(méi)有名稱(chēng)標(biāo)識(shí)符液斜。累贤、
缺點(diǎn)
1. 匿名函數(shù)在棧追蹤中不會(huì)顯示出有意義的函數(shù)名叠穆,使得調(diào)試很困難。
2. 匿名函數(shù)無(wú)法引用自身進(jìn)行遞歸臼膏。只能用過(guò)期的 arguments.callee 在事件觸發(fā)后事件監(jiān)聽(tīng)器需要解綁.
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之類(lèi)的
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
});
塊作用域?
最常見(jiàn)的塊級(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è)非法操作來(lái)強(qiáng)制制造一個(gè)異常
}
catch (err) {
console.log( err ); // 能夠正常執(zhí)行!
}
console.log( err ); // ReferenceError: err not found
let? const
屬于ES6知識(shí)?