上一篇文章地址javascript
function foo(a){
var b = a * 2;
function bar(c){
console.log(a,b,c);
}
bar(b*3);
}
foo(2);
複製代碼
我在這裏把書中的例子再囉嗦一遍hhhjava
欺騙詞法主要有兩種途徑,在這裏說起一下,不作大篇幅的說明,做者也有說盡可能避免使用ide
你們知道一下就能夠啦,在這裏把做者不推薦使用的緣由大概羅列一下把。函數
- eval()和with會被嚴格模式所影響(限制)。
- 這兩個機制的反作用是引擎沒法在編譯時對做用域查找進行優化,由於引擎只能謹慎的認爲這樣的優化是無效的。使用者其中任何一個機制都將致使代碼運行變慢。不要使用它們。
好啦第兩者完結^_^,棒棒的。開啓第三章的總結post
明確概念優化
函數做用域的含義是指,屬於這個函數的所有變量均可以在整個函數的範圍內使用及複用(事實上在嵌套的做用域中也可使用)。這種方案是很是有用的,能充分利用javascript變量能夠根據須要改變值類型的**"動態"**特徵ui
這裏着重說一下規避衝突spa
function foo(){
function bar(a){
i = 3; //for循環的時候會修改所屬做用域中的 i
console.log(a+i)
}
for(var i = 0;i<10;i++){
bar(i*2) //代碼執行到這裏的時候就會將i賦值爲3,從而致使無線循環
}
}
複製代碼
變量衝突常見的就是存在於全局做用域中,當程序中加載了多個第三方庫時,若是它們沒有妥善的將內部私有的函數或者變量隱藏起來,就會很容易引起衝突,還有就是多人合做開發的時候,儘可能將全局變量都作好註釋,或者少用全局變量。調試
類庫的一般作法是暴露出去一個對象code
eg:
var Jquery = {
hide: function(){
/*doSomething*/
},
show: function(){
/*doSomething*/
}
}
複製代碼
咱們知道在任何代碼外面加均可以添加包裝函數,能夠將內部的變量和函數定義**「隱藏」**起來,外部做用域沒法訪問到包裝函數內部的任何內容。
eg
var a = 100;
var b = 200;
var c = a + b;
//這樣的代碼咱們一般會封裝成爲一個功能型的函數
function add(a,b){
return a + b;
}
//------------------------------------變形---------------------------------------------
(function(a,b){
return a + b;
})(100,200);
//包裝函數的聲明以(function...而不單單是以function...開始,在這裏函數會被當作表達式而不是一個標準的函數聲明來處理。
複製代碼
var a = 2;
(function(){
var a = 3;
console.log(a); //3
})()
console.log(a) //2
複製代碼
很是少有人注意到Javascript的ES3規範中規定try/catch分句會建立一個塊做用域,其中聲明的變量僅在catch做用域內部有效
eg
try {
undefined(); //執行一個非法操做
}
catch(err){
console.log(err) //可以正常執行
}
console.log(err); //err not found
複製代碼
let
let關鍵字能夠將變量綁定到所在的任意做用域中,一般是{....}內部。換句話說,let能夠顯示的將做用域用{}清楚的分來,以便於程序的開發,以及維護。
let 聲明的變量不會再做用域內產生變量提高,聲明的代碼在運行以前並不「存在」而非var 聲明的變量會輸出undefined
eg
//var
{
console.log(a); //undefined
var a = 100;
}
// let
{
console.log(a)
let a = 100; //ReferenceError!a is not defined
}
複製代碼
好啦,今天先寫到這裏,待後續。。。