問答
- apply萨赁、call 有什么作用绑榴,什么區(qū)別
1.function.prototype.call()
函數(shù)實例的call方法可以指定函數(shù)內部this的指向深寥,即函數(shù)執(zhí)行時所在的作用域
var obj = {};
var fn = function(){
return this
}
fn() === this // true
fn.call(obj) === obj // true
fn()執(zhí)行時所在的作用域是全局環(huán)境钥顽,所以this是window睛挚,而fn.call(obj)則是在對象obj環(huán)境下執(zhí)行的,所以此時的this指向obj溃蔫。
fn.call(null) === this
fn.call(undefined) === this
fn.call === this
call方法內部的參數(shù)如果為空健提、null和undefined,則默認傳入全局對象伟叛。
var obj = {};
var add = function(x,y){
return x+y
}
add.call(obj,2,3)
call方法還可以接受多個參數(shù)私痹。call的第一個參數(shù)就是this所要指向的那個對象,后面的參數(shù)則是函數(shù)調用時所需的參數(shù)统刮。
2.function.prototype.apply()
apply方法的作用與call方法類似紊遵,也是改變this指向,然后再調用該函數(shù)网沾。唯一的區(qū)別就是癞蚕,它接收一個數(shù)組作為函數(shù)執(zhí)行時的參數(shù)。
function fn(x,y){
return x+y
}
fn.call(null,1,1)//2
fn.apply(null,[1,1])//2
fn函數(shù)本來接受兩個參數(shù)辉哥,使用apply方法以后桦山,就變成可以接受一個數(shù)組作為參數(shù)。
代碼
1.以下代碼輸出什么?
Johb:hi!
2.下面代碼輸出什么醋旦,為什么
[object Window]
因為該函數(shù)的執(zhí)行環(huán)境是全局環(huán)境window
3.下面代碼輸出什么
window對象//調用函數(shù)fn時的全局環(huán)境是在window下
文檔對象//點擊文檔時執(zhí)行回調函數(shù)恒水,此時回調函數(shù)的執(zhí)行環(huán)境是文檔對象
window對象//點擊文檔后過0.2秒后,此時回調函數(shù)的執(zhí)行環(huán)境已經(jīng)變?yōu)槿汁h(huán)境
4.下面代碼輸出什么饲齐,why
John
函數(shù)實例func調用call方法钉凌,使其執(zhí)行環(huán)境在對象john下.
所以,函數(shù)func內部的this指向john對象
5.代碼輸出捂人?
John Smith
6.以下代碼有什么問題御雕,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
var that =this
console.log(this)
//this指的是$btn
that.showMsg()
} )
},
showMsg: function(){
console.log('饑人谷');
}
}