閉包,閉包用途,call、apply、bind 的用法
阿新 • • 發佈:2018-05-26
聲明 func 相互 function span all this 內存 bsp
什麽是閉包:
“函數”和“函數內部能訪問到的變量(也叫環境)”的總和,就是一個閉包。JavaScript
有兩種作用域:全局作用域和函數作用域。函數內部可以直接讀取全局變量。但是,在函數外部無法讀取函數內部聲明的變量。換言之,如果一個函數,使用了它範圍外的變量,那麽‘這個函數+這個變量’就叫做閉包。
function f1() { var n = 1; function f2() { console.log(n); } return f2; } //這段代碼中,函數 f2 和變量 n 的總和就叫做閉包
閉包的用途:
1.從外部讀取函數內部的變量。
function f1() {var n = 9; function f2() { console.log(n); } return f2; } var result = f1(); result(); // 9 //這段代碼中,函數f1的返回值就是函數f2,由於f2可以讀取f1的內部變量,所以就可以在外部獲得f1的內部變量了。
2.讓這些變量始終保持在內存中。
function f1(n) { return function () { return n++; }; } var a1 = f1(1); a1() // 1 a1() // 2 a1() // 3 //這段代碼中,閉包使得內部變量記住上一次調用時的運算結果。
3.封裝對象的私有屬性和私有方法。
function f1(n) { return function () { return n++; }; } var a1 = f1(1); a1() // 1 a1() // 2 a1() // 3 var a2 = f1(5); a2() // 5 a2() // 6 a2() // 7 //這段代碼中,a1 和 a2 是相互獨立的,各自返回自己的私有變量。
call:call 是函數的正常調用方式,並指定上下文 this。
apply:apply 的作用和 call 一樣,只是在調用的時候,傳參數的方式不同。區別是 apply 接受的是數組參數,call 接受的是連續參數。如下代碼:
function add(a,b){ return a+b; } add.call(add, 5, 3); //8 add.apply(add, [5, 3]); //8
bind:bind 接受的參數跟 call 一致,只是 bind 不會立即調用,它會生成一個新的函數,你想什麽時候調就什麽時候調。如下代碼:
function add(a, b){ return a+b; } var foo1 = add.bind(add, 5,3); foo1(); //8 var foo1 = add.bind(add, 5,3); foo1(); //8
閉包,閉包用途,call、apply、bind 的用法