this
1.默认绑定 2.显式绑定 3.隐式绑定 4.new 绑定 5.箭头函数绑定。
1.调用位置。函数在代码中被调用的位置。
2.绑定规则 默认绑定:this指向全局对象,严格模式下,this指向undefined
隐式绑定: 函数中的this会被绑定到上下文对象当中。
显式绑定:call apply
function foo() {
console.log( this.a );}
var obj = { a: 2}; foo.call( obj ); // 2
使用new 调用foo()函数时,会创造一个新对象并把它(bar)绑定到构造函数中的this.
function foo(a){this.a=a;}
var obj=new foo(3)
3.箭头函数,箭头函数根据外层作用域来决定this。
4.foo()内部的箭头函数会捕获调用函数的this.箭头函数的this无法被更改。
function foo() {
// 返回一个箭头函数
return (a) => {
// this继承自foo()
console.log( this.a );
};}
var obj1 = {
a: 2};
var obj2 = { a: 3}
var bar = foo.call( obj1 ); bar.call( obj2 ); // 2,不是3!
call,apply,bind
call的语法: func.call(thisArg,arguments) func.apply(thisArg,[...arguments]) .call(thisArgs,a,b,c) .apply(thisArgs,[a,b])
call,apply作用相同,传参不同。call只能单个传参 apply方法调用一个函数,使其具有指定的this值,并作为一个数组传递需要的参数。 bind是创建一个函数,在其被调用时,将this关键字设置为提供的值,在调用新函数时,在任何提供之前给定一个参数序列,
,所以在调用时要加() eg: b.bind(q,1,8)()
var a={
name:"jiayi",
add:function(a,b){
console.log(a+b)
}
}
var b=a.add
b.apply(a,[1,3])
b.call(a,2,1)
b.bind(a,1,8)()