this,bind,call,apply三者之间的区别

this

this的指针作用域:

  • 1、在全局中使用this,表示全局的global对象,在浏览器中this指向window对象;
  • 2、当在函数执行环境中使用this时,如果函数没有明显的作为非window对象的属性,而只是定义了函数,不管这个函数是不是定义在另一个函数中,这个函数中的this仍然表示window对象。如果函数显示地作为一个非window对象的属性,那么函数中的this就代表这个对象;
  • 3、当通过new运算符来调用函数时,函数被当做一个构造函数,this指向构造函数创建出来的对象;
  • 4、this在箭头函数中失效了,因为这是箭头函数没有单独的this值,箭头函数this与声明的所在的上下文相同,也就是说明箭头函数的时候,不会隐士的调用this参数,而是从定义时的函数继承上下文。

bind、call、apply区别:

在JS中,这三者都是用来改变函数的this对象的指向的,总结三者的相似之处:

1、 都是用来改变函数的this对象的指向的
2、 第一个参数都是this要指向的对象
3、 都可以利用后续参数传参

call, apply, bind 三个之间的区别:
  • call和apply都是对函数的直接调用,而bind方法返回的仍然>是一个函数,因此后面还需要()来进行调用才可以
  • call后面的参数与say方法中是一一对应的,而apply的第二>个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。

call

继承,把父类私有属性和方法,克隆一份一模一样的,作为子类私有的属性和方法。

   function A() { // 一个函数有三种角色:1、普通函数(私有作用域)2、类(new)3、普通对象(__proto__)
    this.x = 100;
    this.y = 200;
    this.a = function () {
        console.log(this.x);
    }
}
A.prototype.getX = function () {
    console.log(this.x);
};
function B() {
    this.y = 100;
    // this->b
  //A()
    A.call(this,aa,bb);// ->A.call(b) 把A执行,让A中的this变为了B
    this.A(aa,bb)
    //此时的A.prototype对B类来说是没用的,因为B没有继承A
}
var b = new B;
console.log(b.x); // ->100
b.a(); // ->100
console.log(b.y); // ->200

apply

apply和call方法的作用是一模一样的,都是用来改变方法中this关键字并且将方法执行,跟call唯一的的区别就是语法的区别:

  //call传递参数是用逗号分隔,一个一个传进去
fn.call(obj, arg1,arg2,arg3.....)
//apply传递参数是用一个数组
fn.apply(obj, [arg1,arg2,arg3....])

bind

这个方法在IE6-IE8下不兼容。bind也是改变this的指向,但是对象在bind之后不会直接执行,需再次调用。

var obj = {num:1};
function fn(num1, num2) {
    console.log(num1+num2);
}
fn(200,300)
fn.call(obj, 100, 200);//->输出300

fn.bind(obj, 100, 200);  // 只是改变了fn中的this为obj,并且给fn传递了两个参数值,但是此时并没有执行fn这个函数。
 
//要让fn这个函数执行,下面的写法就行。
var myFn = fn.bind(obj, 100, 200);
newFn<====obj.fn(100,200)  
newFn()
// obj={
	//newfn:fn
//}
myFn();
//这是因为执行bind会有一个返回值,这个返回值myFn就是我们把fn的this改变后的那个结果!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚子·小哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值