標籤:範圍 屬性 傳回值 獨立 OLE bind java pre his
什麼是閉包:
“函數”和“函數內部能訪問到的變數(也叫環境)”的總和,就是一個閉包。
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() // 1a1() // 2a1() // 3//這段代碼中,閉包使得內部變數記住上一次調用時的運算結果。
3.封裝對象的私人屬性和私人方法。
function f1(n) { return function () { return n++; };}var a1 = f1(1);a1() // 1a1() // 2a1() // 3var a2 = f1(5);a2() // 5a2() // 6a2() // 7//這段代碼中,a1 和 a2 是相互獨立的,各自返回自己的私人變數。
call:call 是函數的正常調用方式,並指定上下文 this。
apply:apply 的作用和 call 一樣,只是在調用的時候,傳參數的方式不同。區別是 apply 接受的是數組參數,call 接受的是連續參數。如下代碼:
function add(a,b){ return a+b;}add.call(add, 5, 3); //8add.apply(add, [5, 3]); //8
bind:bind 接受的參數跟 call 一致,只是 bind 不會立即調用,它會產生一個新的函數,你想什麼時候調就什麼時候調。如下代碼:
function add(a, b){ return a+b;}var foo1 = add.bind(add, 5,3); foo1(); //8var foo1 = add.bind(add, 5,3); foo1(); //8
閉包,閉包用途,call、apply、bind 的用法