一霜医、call()和apply()方法
-
call
方法:
語(yǔ)法:call(thisObj,[,arg1[, arg2]...)
第一個(gè)參數(shù)是在其中運(yùn)行函數(shù)的作用域,其余參數(shù)直接傳遞給函數(shù)驳规,使用
call()
方法時(shí)肴敛,傳遞給函數(shù)的參數(shù)必須逐個(gè)列舉出來(lái)
定義:在特定的作用域中調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)的this
對(duì)象的值
如果沒(méi)有提供 thisObj
參數(shù),那么 Global
對(duì)象被用作 thisObj
医男。
-
apply
方法:
語(yǔ)法:call(thisObj,[,argArray])
第一個(gè)參數(shù)是在其中運(yùn)行函數(shù)的作用域砸狞,另一個(gè)參數(shù)是數(shù)組。其中镀梭,第二個(gè)參數(shù)可以使
Array
的實(shí)例刀森,也可以是arguments
對(duì)象
如果沒(méi)有提供argArray
和 thisObj
任何一個(gè)參數(shù),那么 Global
對(duì)象將被用作thisObj
报账, 并且無(wú)法被傳遞任何參數(shù)研底。
- code1
window.name = "func";
function func() {
console.log(this.name);
}
func(); // func;
var obj = {name:'obj'};
func.call(obj); //obj 等價(jià)于obj.func()
- code2
function add(a,b)
{
return a+b;
}
function calladd(a,b)
{
return add.call(this,a,b)
}
alert(calladd(10,10)); //20
calladd
執(zhí)行add()
函數(shù)時(shí)傳入了this
作為this
值(因?yàn)槭窃谌肿饔糜蛑姓{(diào)用的,所以傳入的就是window
對(duì)象)和兩個(gè)參數(shù)。
- code
function add(a,b)
{
return a+b;
}
function add1(a,b)
{
return add.apply(this,arguments)
}
function add2(a,b)
{
return add.apply(this,[a,b])
}
alert(add1(10,10)); //20
alert(add2(10,10)); //20
add1()
執(zhí)行apply()
函數(shù)時(shí)傳入了this
作為this
值(因?yàn)槭窃谌肿饔糜蛑姓{(diào)用的,所以傳入的就是window
對(duì)象)和arguments
(add2()
傳入的是數(shù)組)對(duì)象哨颂。
二买鸽、bind方法
語(yǔ)法:fun.bind(thisArg[, arg1[, arg2[, ...]]])
簡(jiǎn)單地看一下這些參數(shù)的含義
thisArg
當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的this指向,當(dāng)使用new 操作符調(diào)用綁定函數(shù)時(shí)加匈,該參數(shù)無(wú)效。
arg1, arg2, ...
當(dāng)綁定函數(shù)被調(diào)用時(shí),這些參數(shù)將傳遞給被綁定的方法胚吁。
綁定this作用域示例
window.name = 'windowName'
let obj = {
name: 'qianlongo',
showName: function() {
console.log(this.name)
}
}
obj.showName() // qianlongo
let showName = obj.showName
showName() // windowName
let bindShowName = obj.showName.bind(obj)
bindShowName() // qianlongo
通過(guò)以上簡(jiǎn)單示例,我們知道了第一個(gè)參數(shù)的作用?就是綁定函數(shù)運(yùn)行時(shí)候的this指向
第二個(gè)參數(shù)開(kāi)始起使用示例
let sum = (num1, num2) => {
console.log(num1 + num2)
}
let bindSum = sum.bind(null, 1)
bindSum(2) // 3
bind可以使一個(gè)函數(shù)擁有預(yù)設(shè)的初始參數(shù)愁憔。這些參數(shù)(如果有的話)作為bind的第二個(gè)參數(shù)跟在this(或其他對(duì)象)后面腕扶,之后它們會(huì)被插入到目標(biāo)函數(shù)的參數(shù)列表的開(kāi)始位置,傳遞給綁定函數(shù)的參數(shù)會(huì)跟在它們的后面吨掌。
參數(shù)的使用基本上明白了半抱,我們?cè)賮?lái)看看使用new去調(diào)用bind之后的函數(shù)是怎么回事。
function Person(name, sex) {
console.log(this) // Person {}
this.name = name
this.sex = sex
return this;
}
let obj = {
age: 100
}
let bindPerson = Person.bind(obj, 'qianlongo')
let p = new bindPerson('boy')
console.log(p) // Person {name: "qianlongo", sex: "boy"}
有沒(méi)有發(fā)現(xiàn)bindPerson內(nèi)部的this不再是bind的第一個(gè)參數(shù)obj膜宋,此時(shí)obj已經(jīng)不再起效了窿侈,而是新建了一個(gè)Person對(duì)象。