權威指南上的說法是:能夠將call 和apply看作是某個對象的方法,經過調用方法的形式數組
間接調用函數;須要重點說明是 :經過call和apply 調用的 函數:具體用法---》以下:
app
1.先說call的用法,call能夠接收兩個參數,也可能不是兩個;第一個參數是要調用函數的函數
母對象,在函數體內經過this來得到對它的引用;post
function a(){
console.log(this); // 輸出函數a中的this對象
}this
function b(){} // 定義函數b
var obj = {name:'onepixel'}; //定義對象objcode
//調用
a();//this表明window對象;
a.call;//自己是一個函數方法//window
console.log(a.call); //function call() { [native code] };
a.call(null); //window 傳入null,函數中的this,指向window
a.call(undefined);//window 傳入undefined,函數中的this,指向window
a.call(1); //Number 傳入數值型,this指向對應的包裝類型,Number
a.call(''); //String 傳入字符串,this指向string 類型
a.call(true); //Boolean 傳入布爾類型,this指向Boolean類型
a.call(b);//function b(){}
a.call(obj); //Object 指向obj;
//call的用法;對象
能夠看到call()中第一個參數出入什麼樣的參數,this 就指向對應的包裝類型;繼承
不傳參,或者參數爲null,undefined 時,this指向window;字符串
具體用法:string
//call的用法;
var m = {
name:'onepixel',
say:function(){
console.log('hi,i am function m!');
},
}
function n(name){
console.log('post params:'+name);
console.log('i am '+this.name);
this.say;
}
n.call(m,'test');//post params:test
// i am onepixel
//I'm function a! 不知道爲何沒有調用;
也就是說n能夠經過call來調用M 中的方法;
//關於appply
//apply和call的惟一區別是第二個參數的傳遞方式不一樣,
//apply的第二個參數必須是一個數組,而call容許傳遞一個參數列表
//值得你注意的是,雖然apply接收的是一個參數數組,但在傳遞給調用函數時,
//倒是以參數列表的形式傳遞
function f(x,y,z){
console.log(x,y,z)
}
f.apply(undefined,[1,2,3]);//1,2,3
//第一個參數傳null或undedined指向window
重點://js中麼有繼承的概念,call和apply卻能夠實現;
function Animal(name,weight){
this.name = name;
this.weight = weight;
}
function Cat(){
Animal.call(this,'cat','50');
//Animal.apply(this,['cat','50']);
this.say = function(){
console.log('i am '+this.name+'myweight'+this.weight)
}
}
var cat = new Cat();
cat.say();
這段代碼本身理解一下。。。。