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改变后的那个结果!
上一篇:
Java基础知识总结(2021版)
下一篇:
Java面试题系列之Spring常用注解