1. 程式人生 > >閉包,閉包用途,call、apply、bind 的用法

閉包,閉包用途,call、apply、bind 的用法

聲明 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 的用法