這是一道本日碰到的面試題
由於setTimeout屬於匿名函數,this指向window,所以this.id = 1
但照樣先總結一下call和apply的用法。
起首引見一下call和apply的定義
obj.call(thisObj, arg1, arg2,…)
obj.apply(thisObj, [arg1, arg2,…])
call和apply的作用是轉變函數運行時的上下文環境(轉變this的指向),將obj綁定到thisObj,或者說this.Obj挪用了obj內里的要領。
call和apply的作用
當一個對象須要挪用別的一個對象內里的要領的時刻,能夠用到call和apply,call和apply能夠明白成是繼續別的一個對象的要領。
起首我們豎立兩個對象obj1和obj2
假如obj2對象要挪用obj1中的func1要領(能夠明白為在obj2的環境中實行obj1.func1要領),則
obj1.func1.call(obj2); //輸出:obj2Name
obj1.func1.apply(obj2);//輸出:obj2Name
call和apply第一個參數都是示意obj1綁定的對象,假如obj1要綁定到this,此時obj1就是綁定到全局,如:
obj1.func1.call(this);//輸出:windowName
obj1.func1.apply(this);//輸出:windowName
假如obj2對象要挪用obj1中的func2要領,則
obj1.func2.call(obj2,1,2);//輸出:3
obj1.func2.apply(obj2,[1,2]);//輸出:3
call和apply完成繼續
運用call要領挪用父組織函數
function Product(name, price) {
this.name = name;
this.price = price;
if (price < 0) {
throw RangeError(
'Cannot create product ' + this.name + ' with a negative price'
);
}
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
//等同於
function Food(name, price) {
this.name = name;
this.price = price;
if (price < 0) {
throw RangeError(
'Cannot create product ' + this.name + ' with a negative price'
);
}
this.category = 'food';
}
//function Toy 同上
function Toy(name, price) {
Product.call(this, name, price);
this.category = 'toy';
}
var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
bind要領和call、apply的區分
bind要領也是用來轉變this的指向
var a = {
user:"追夢子",
fn:function(){
console.log(this.user);
}
}
var b = a.fn;
b.bind(a);
沒有被打印,這就是bind要領與apply、call要領的差別。bind要領返回的是修正事後的函數
var a = {
user:"追夢子",
fn:function(){
console.log(this.user); //追夢子
}
}
var b = a.fn;
var c = b.bind(a);
c();
實行勝利