this 是运行期间进行的绑定和它在哪里申明没有关系
隐示绑定
比如通过对象调用,就会隐式绑定到对象上
默认绑定
比如在全局作用域上调用函数,就会默认绑定到全局
显示绑定
通过call 、apply、bind 可以显示改变this的绑定
构造函数绑定
new 运算符会生成一个新对象
通过Protype属性进行原型链接
将新对象绑定到函数调用的this 上
如果没有返回其它对象,则自动返回一个新对象
绑定的优先级 : new >显示>隐式>默认
call 、apply 、bind 的区别:
call : object.call( object, 'argument' ,'argument' );第二个参数是字符串
apply:object.apply(object, [ 'argument' , 'argument' ]); 第二个参数是数组
bind:object.bind( object, 'argument', ' argument ' )(); bind 是返回的一个函数,只有调用这个函数后才算执行
特殊情况的 把 null 或者 undefined 作为this的绑定对象传入,这样的实际情况是采用默认的绑定规则。
用途就是 用于展开数组
function(a,b){
console.log(a,b)
}
print.apply(null, [1,2] );
还要就是使用bind 用于: 柯里化
var foo = print.bind(null ,1)
foo(2);
箭头函数:
ES6 箭头函数不能绑定 this
关键字,所以它将在词法上向上查找,然后使用定义它所在的作用域。
普通函数中的this表示调用此函数时的对象。而箭头函数是没有自己的this的,箭头函数里面的this会继承自外部的this。或者用代码块的概念解释会更加直观:箭头函数中的this就是外层代码块的this。
箭头函数体内的this
对象,就是定义该函数时所在的作用域指向的对象,而不是使用时所在的作用域指向的对象。
var x = 11;
var obj = {
x: 22,
methods: {
x: 33,
say: function() {
console.log(this.x)
},
say2: () => {
console.log(this.x)
}
}
}
obj.methods.say();//33 普通函数this表示调用次函数时的对象即methods对象
obj.methods.say2();//11 say2中this所在的外层代码块(向外数一个花括号)是methods对象 但并不是说this就是该对象,而是指methods对象中的this 此时this是window
箭头函数使用注意点:
- 不可以当作构造函数,也就是说,不可以使用
new
命令,否则会抛出一个错误。 - 不可以使用
arguments
对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。 - 不可以使用
yield
命令,因此箭头函数不能用作 Generator 函数。