一、call()和apply()方法
-
call
方法:
语法:call(thisObj,[,arg1[, arg2]...)
第一个参数是在其中运行函数的作用域,其余参数直接传递给函数,使用
call()
方法时,传递给函数的参数必须逐个列举出来
定义:在特定的作用域中调用函数,实际上等于设置函数体内的this
对象的值
如果没有提供 thisObj
参数,那么 Global
对象被用作 thisObj
。
-
apply
方法:
语法:call(thisObj,[,argArray])
第一个参数是在其中运行函数的作用域,另一个参数是数组。其中,第二个参数可以使
Array
的实例,也可以是arguments
对象
如果没有提供argArray
和 thisObj
任何一个参数,那么 Global
对象将被用作thisObj
, 并且无法被传递任何参数。
- code1
window.name = "func";
function func() {
console.log(this.name);
}
func(); // func;
var obj = {name:'obj'};
func.call(obj); //obj 等价于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
执行add()
函数时传入了this
作为this
值(因为是在全局作用域中调用的,所以传入的就是window
对象)和两个参数。
- 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()
执行apply()
函数时传入了this
作为this
值(因为是在全局作用域中调用的,所以传入的就是window
对象)和arguments
(add2()
传入的是数组)对象。
二、bind方法
语法:fun.bind(thisArg[, arg1[, arg2[, ...]]])
简单地看一下这些参数的含义
thisArg
当绑定函数被调用时,该参数会作为原函数运行时的this指向,当使用new 操作符调用绑定函数时,该参数无效。
arg1, arg2, ...
当绑定函数被调用时,这些参数将传递给被绑定的方法。
绑定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
通过以上简单示例,我们知道了第一个参数的作用�就是绑定函数运行时候的this指向
第二个参数开始起使用示例
let sum = (num1, num2) => {
console.log(num1 + num2)
}
let bindSum = sum.bind(null, 1)
bindSum(2) // 3
bind可以使一个函数拥有预设的初始参数。这些参数(如果有的话)作为bind的第二个参数跟在this(或其他对象)后面,之后它们会被插入到目标函数的参数列表的开始位置,传递给绑定函数的参数会跟在它们的后面。
参数的使用基本上明白了,我们再来看看使用new去调用bind之后的函数是怎么回事。
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"}
有没有发现bindPerson内部的this不再是bind的第一个参数obj,此时obj已经不再起效了,而是新建了一个Person对象。