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改变后的那个结果!