js學習筆記01-函數,作用域,閉包
//變量的占位符, ${}裏邊 依舊是js,字符串拼接
var str1 = "Hello";
var str2 = "World";
console.log("say: "+str1+" "+str2+"!");
console.log(`say: ${str1} ${str2}!`);
函數function
像處理(字符串、數組或數字)一樣來處理函數
1)存儲在變量中。
2)從一個函數返回。
3)作為參數傳遞給另一個函數
回調函數
接受其他函數作為參數(和/或返回函數,如上一部分所述)的函數被稱為高階函數。作為參數傳遞給另一個函數的函數被稱為回調函數。
數組方法 forEach()遍歷數組,map獲取數組中元素的詳情,filter篩選
forEach()
數組的 forEach() 方法接受一個回調函數,並為數組中的每個元素調用該函數。換句話說,forEach() 讓你可以叠代(即遍歷)一個數組,類似於使用 for 循環
[1, 5, 2, 4, 6, 3].forEach(function logIfOdd(n) { if (n % 2 !== 0) { console.log(n); } }); // 1 //5 //3 function logIfOdd(n) { if (n % 2 !== 0) { console.log(n); } } [1, 5, 2, 4, 6, 3].forEach(logIfOdd);
map()
map() 不同於forEach(),會根據回調函數所返回的內容返回一個新的數組。
map() 方法返回一個新的數組,而不會修改原始數組。
var arrayName = ["fish","sugarbeans","theredhands"];
var arrayNameLength = arrayName.map(function(name){
return name.length;
})
console.log(arrayNameLength);
//[4,10,11]
filter 過濾器
數組的 filter() 方法與 map() 方法類似,
var arrayNewName = arrayName.filter(function(name){ return name.length>6; }) console.log(arrayNewName);
作用域
函數的作用域包括:
1)該函數的參數。
2)該函數內部聲明的局部變量。
3)來自其父函數作用域的變量。
4)全局變量。
在訪問變量時,JavaScript 引擎將遍歷作用域鏈,首先查看最內層(例如函數的局部變量),然後查看外層作用域,最後在必要時到達全局作用域。
變量陰影
當你所創建的變量與作用域鏈中的另一個變量具有相同名稱時
JavaScript 不會彈出錯誤消息或阻止你創建這樣一個變量。實際上,局部作用域的變量只會暫時“遮蔽”外部作用域中的變量。這被稱為變量陰影。
let n = 2;
function myFunction() {
let n = 8;
console.log(n);
}
myFunction();
// 8
閉包
閉包--函數和該函數聲明位置的詞法環境的組合
1)每次定義函數時,都會為該函數創建閉包
2)函數會保持對其父作用域的引用, 如果仍可訪問該函數的引用,作用域就會保持不變
3)閉包類似java私有屬性的機制
function count() {
var arr = [];
for (var i=1; i<=3; i++) {
arr.push(function () {
return i * i;
});
}
return arr;
}
var results = count();
var f1 = results[0]; //()=>16
var f2 = results[1]; //()=>16
var f3 = results[2]; //()16
立即調用函數表達式(IIFE)
定義之後立即被調用的函數
將一個函數包在圓括號中,然後在末尾添加一對圓括號來調用它
(function sayHi(){
alert(‘Hi there!‘);
})();
//帶參數
(function (x, y){
console.log(x * y);
})(2, 3); // 6
IIFE 的主要用途之一就是創建私有作用域
如果你只想完成某個一次性任務(例如初始化應用程序),那麽 IIFE 將是完成任務,同時避免額外變量汙染全局環境的好辦法
js學習筆記01-函數,作用域,閉包