call( ),apply( ) 和 bind( )
都是Function
的方法,所有函数都有这三个非继承
而来的方法。都是Function.prototype
的方法。用途都是在特定的作用域
中调用函数。
箭头函数
中的this
指向离自己最近
的非箭头函数作用域
里
bind
后函数不会执行,而只是返回一个改变了上下文
的另一个函数
,而call和apply
是直接执行函数
。若无参数,apply与call
基本没什么区别
都是用来改变函数
的运行时的上下文对象(执行上下文)
=>继承
,或者说是改变函数内部
的this指向
。
apply()
方法接收两个参数,一个是在其中运行函数的作用域
,一个是参数数组
,(这个参数数组可以是Array
的实例,也可以是类数组arguments
;)
call()
方法和apply()
的作用相同,区别仅在于接收的参数的方式
不一样,使用call
时候参数必须逐个列举
出来传给函数。
function sum(num1, num2){
return num1 + num2;
}
function callsum1(num1, num2){
return sum.apply(this,arguments);
//return sum.apply(this, [sum1,sum2]);
}
function callsum2(num1, num2){
return sum.call(this,num1, num2);
}
当参数明确的时候,建议使用call,
但传入的参数不明确的时候,或者是数组的时候,建议使用apply。
扩充函数赖以运行的作用域,对象不需要和方法有任何耦合的关系。
var animal = {
words:'......',
speak:function(say){
console.log(say + ' ' + this.words);
}
}
var dog ={
words: 'wang'
}
//dog没有say这个方法,但是可以通过call来调用aniaml的say方法。
animal.speak.call(dog, 'speak');
//dog就是call()这个方法的上下文,this指向了dog这个对象。
1.非严格条件下,call和apply
的第一个参数为null、undefined、空
,函数内的this
指向window
(浏览器 ) 或global
。
严格模式下,函数内的this null
是null
,undefined和空
为undefined
bind
返回的是对应的函数
,不会立即调用
,而call、apply
都是立即调用
的。
this
指向还可以通过new操作符
来改变
通常情况下this
指向调用他的最近一级对象
普通函数里面指向Window
Array.prototype.slice.call ( arguments);
[].prototype.slice.apply(arguments);
[].shift.call(arguments);//保存需要绑定的this上下文,就是第一个参数
Object.prototype.toString.call(obj) === '[object Array]' ;
new fn()
改变fn
内部this
指向可等同于如下:
a = 2;
let obj = {
a: 1,
func: function () {
var self = this;
console.log(this.a);//1
console.log(self.a);//1
(function () {
console.log(this.a);//2
console.log(self.a);//1 闭包作用域 最近的调用者obj
})();
}
};
obj.func();//1,1,2,1;
网友评论