眾所周知,每個函數都包含兩個非繼承而來的方法:apply()與call() 方法,他們都可以接收參數,他們的作用都是一樣的,都是在特定的作用域裡面調用函數,相當於設置函數體內的this對象的值,這也是他們的強大之處,就在於可以擴充函數運行的作用域,下麵 就用代碼來說明他們的作用,來看兩個demo: ...
眾所周知,每個函數都包含兩個非繼承而來的方法:apply()與call() 方法,他們都可以接收參數,他們的作用都是一樣的,都是在特定的作用域裡面調用函數,相當於設置函數體內的this對象的值,這也是他們的強大之處,就在於可以擴充函數運行的作用域,下麵 就用代碼來說明他們的作用,來看兩個demo:
demo1:
window.name = "Jack";
var person = {
name:"Tom"
}
function who(){
console.log(this.name);
}
who(); //Jack
person.who = who;
person.who(); //Tom
demo2:
window.name = "Jack";
var person = {
name:"Tom"
}
function who(){
console.log(this.name);
}
who(); //Jack
who.call(this) //this指向全局 Jack
who.call(window) //Jack
who.call(person) //Tom
從兩個demo對比來看 ,此時call(apply)的用法就是擴充作用域;
call與apply區別:
call與apply的唯一的不同點就是傳參問題了,apply可以接受兩個參數,第一個參數指向作用域對象(this),第二個參數可以接收參數數組,也可以是arguments對象;call方法,第一個參數相同,第二個參數後面明確接收每一個參數,例如call(this,person1,person2...)