this是什么?
this是函数运行时,函数内部自动生成的一个对象,只能在函数内部使用。
可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。
javaScript 中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用。在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context),即 this 绑定的对象。很多 JavaScript 中的技巧以及类库都用到了该方法。
this关键字虽然会根据环境变化,但是它始终代表的是调用当前函数的那个对象。
改变this的几种方法?
1.使用ES6的箭头函数
箭头函数的 this 始终指向函数定义时的 this,箭头函数中没有 this 绑定,必须通过查找作用域链来决定其值,如果箭头函数被非箭头函数包含,则 this 绑定的是最近一层非箭头函数的 this,否则,this 为 undefined。
2.使用apply .call.bind,同时解释三者的区别。
三种方式都可以改变this指向
var name = 'windows';
function sayName() {
return this.name;
}
function sayBindName() {
return this.name;
}
var obj = {
name: 'john',
sayName: sayName,
sayBindName: sayBindName.bind(window) // 这里也可以用call 或者apply,只不过在log的时候要吧sayBindName后面的()去掉,因为bind不会立即执行,而call和apply会立即执行
}
console.log(obj.name, obj.sayName(), obj.sayBindName()); // jhon, jhon , windows
三者的区别:apply()接受两个参数,第一个事要绑定的this指向的对象,第二个是一个包含多个参数的数组。
call() 和apply()的区别在于第二个参数不同,call()接受多干个参数列表
bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。需要手动调用。