1. 程式人生 > >js學習筆記01-函數,作用域,閉包

js學習筆記01-函數,作用域,閉包

學習筆記

${var}
//變量的占位符, ${}裏邊 依舊是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-函數,作用域,閉包