文章根據codewhy老師的課程整理深入JavaScript高級語法-coderwhy大神新課-學習視頻教程-騰訊課堂
一、陣列中的5個高階函式
1.filter: 過濾
// [10, 5, 11, 100, 55]
// 10 => false => 不會被放到newNums
// 5 => false => 不會被放到newNums
// 11 => false => 不會被放到newNums
// 100 => false => 不會被放到newNums
// 55 => false => 不會被放到newNums
var newNums = nums.filter(function(item) {
return item % 2 === 0 // 偶數
})
console.log(newNums)
2.map: 映射
// [10, 5, 11, 100, 55]
var newNums2 = nums.map(function(item) {
return item * 10
})
console.log(newNums2)
3.forEach: 迭代
nums.forEach(function(item) {
console.log(item)
})
4. find/findIndex
var item = nums.find(function(item) {
return item === 11
})
console.log(item)
var friends = [
{name: "why", age: 18},
{name: "kobe", age: 40},
{name: "james", age: 35},
{name: "curry", age: 30},
]
var findFriend = friends.find(function(item) {
return item.name === 'james'
})
console.log(findFriend)
var friendIndex = friends.findIndex(function(item) {
return item.name === 'james'
})
console.log(friendIndex) 列印索引值
5.reduce: 累加
// nums.reduce
// [10, 5, 11, 100, 55]
// var total = 0
// for (var i = 0; i < nums.length; i++) {
// total += nums[i]
// }
// console.log(total)
// prevValue: 0, item: 10
// prevValue: 10, item: 5
// prevValue: 15, item: 11
var total = nums.reduce(function(prevValue, item) {
return prevValue + item
}, 0)
console.log(total)
二、JS閉包
在JavaScript中,函式是非常重要的,并且是一等公民:
那么就意味著函式的使用是非常靈活的;
函式可以作為另外一個函式的引數,也可以作為另外一個函式的回傳值來使用;
函式和方法的區別:
// 函式function: 獨立的function, 那么稱之為是一個函式
function foo() {}
// 方法method: 當我們的一個函式屬于某一個物件時, 我們成這個函式是這個物件的方法
var obj = {
foo: function() {}
}
obj.foo()
JS中閉包的定義
閉包跟函式最大的區別在于,當捕捉閉包的時候,它的 自由變數 會在捕捉時被確定,這樣即使脫離了捕捉時的背景關系,它也能照常運行;
JavaScript 中,每當創建一個函式,閉包就會在函式創建的同時被創建出來;
那么我的理解和總結:
一個普通的函式function,如果它可以訪問外層作用域的自由變數,那么這個函式就是一個閉包;
從廣義的角度來說:JavaScript中的函式都是閉包;
從狹義的角度來說:JavaScript中一個函式,如果訪問了外層作用域的變數,那么它是一個閉包;
閉包的訪問程序

閉包的執行程序
那么函式繼續執行呢?
這個時候makeAdder函式執行完畢,正常情況下我們的AO物件會被釋放;
但是因為在0xb00的函式中有作用域參考指向了這個AO物件,所以它不會被釋放掉;

閉包父級作用域不會被銷毀,因為還有指標指著父級的OA

閉包的記憶體泄露
但是目前因為在全域作用域下add10變數對0xb00的函式物件有參考,而0xb00的作用域中AO(0x200)有參考,所以最侄訓造成這些記憶體都是無法被釋放的;
所以我們經常說的閉包會造成記憶體泄露,其實就是剛才的參考鏈中的所有物件都是無法釋放的;
那么,怎么解決這個問題呢?
因為當將add10設定為null時,就不再對函式物件0xb00有參考,那么對應的AO物件0x200也就不可達了;
在GC的下一次檢測中,它們就會被銷毀掉;
add10 = null
AO物件不會被銷毀時,是否里面的所有屬性都不會被釋放?
閉包中沒參考的會自動被釋放
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/350984.html
標籤:其他
上一篇:JavaScript實作彈性導航
