1. 程式人生 > >js中call, apply, bind的自我心得

js中call, apply, bind的自我心得

apply 和 call 的區別

apply和call: apply和call作用相同,只是在傳參上面有點小差別,兩個方法一個是將呼叫函式中的引數放在一個數組中傳過去,一個是一個一個傳過去。 這裡用apply方法做講解,apply方法傳入兩個引數:一個是作為函式上下文的物件,指的是呼叫這個apply方法的函式,他的函式內部this由你傳過來的物件代替了,另外一個是作為函式引數所組成的陣列。

例項:

var obj = {
    name : 'linxin'
}
function func(firstName, lastName){
    console.log(firstName + ' ' + this.name + ' ' + lastName);
}
func.apply(obj, ['A', 'B']);

解析:這裡func函式呼叫了apply方法,將obj和一個數組當做兩個引數,此時func函式中的this已經指向obj物件了,所以func函式中的this.name變成了obj.name, 控制檯將會輸出 A linxin B

apply 和 call 的用法

1,改變this指向: 改變呼叫函式中this的指向,預設引數為this

2,借用別的物件的方法:

例子:

var Person1  = function () {
    this.name = 'linxin';
}
var Person2 = function () {
    this.getname = function () {
        console.log(this.name);
    }
    Person1.call(this);
}
var person = new Person2();
person.getname();

解析:Person1.call(this)的意思是把Person2函式內的this傳到Person1函式內,這樣Person1函式內的this.name = ‘linxin’就代表著Person2函式內中寫了this.name = ‘linxin’,這樣Person2函式就多了一個name的屬性,類似java中的extend繼承

3,呼叫函式

apply、call 方法都會使函式立即執行,因此它們也可以用來呼叫函式

function func() {
    console.log('linxin');
}
func.call();            // linxin

call 和 bind 的區別

在 EcmaScript5 中擴充套件了叫 bind 的方法,在低版本的 IE 中不相容。它和 call 很相似,接受的引數有兩部分,第一個引數是是作為函式上下文的物件,第二部分引數是個列表,可以接受多個引數。 它們之間的區別有以下兩點

1.bind 發返回值是函式

var obj = {
    name: 'linxin'
}

function func() {
    console.log(this.name);
}

var func1 = func.bind(obj);
func1();                        // linxin

2.引數的使用

function func(a, b, c) {
    console.log(a, b, c);
}
var func1 = func.bind(null,'linxin');

func('A', 'B', 'C');            // A B C
func1('A', 'B', 'C');           // linxin A B
func1('B', 'C');                // linxin B C
func.call(null, 'linxin');      // linxin undefined undefined

call 是把第二個及以後的引數作為 func 方法的實參傳進去,而 func1 方法的實參實則是在 bind 中引數的基礎上再往後排