总结:
- 在浏览器中,在全局范围内this,指向window。
- 在函数中,this永远指向最后调用它的那个对象。
- 在构造函数中,this指向New出来的新对象。
- call、apply、bind中的this被强制绑定在那个对象上。
- 箭头函数比较特殊,箭头函数的this为父作用域的this。
- 三者都可以传参,也是函数内部的API。
首先呢,call、apply、bind三个方法都是Function.prototype中的属性,被称为实例对象
例子
:
console.log(Function.prototype.hasOwnProperty('call')) //true
console.log(Function.prototype.hasOwnProperty('apply')) //true
console.log(Function.prototype.hasOwnProperty('bind')) //true
以上这三种方法都可以在对象,数组,函数中使用
- Function.prototype.call( )
<script>
var name = '李四'
var obj = {
name: '张三',
fn: function () {
console.log(this.name);
}
}
obj.fn(this) //打印出来是张三 原因就是fn函数 访问外部的对象里面的name
obj.fn.call(this) //打印出来是李四 call这种方法就会调用全局的this
</script>
call方法,修改this指向的,并且会立即执行该函数
箭头函数中的this,不取决于函数执行时,取决于函数定义时,时刻定义父级的上下文
- apply( )
- 跟call唯一的区别就是
传参方式上
apply把需要传递给fn的参数放到一个数组(或者类数组)中传递进去,虽然写的是一个数组,但是也相当于给fn一个个的传递
3.bind( )
bind:语法和call一模一样,区别在于call立即执行,bind等待执行,bind不兼容IE6~8