javascript中的this, call, apply

thisjavascript

this能够意为这时,javascript又是一门运行时的语言,因此咱们来看看this在不一样的状况下的含义java

  • 处于被对象调用的方法中
  • 处于普通函数中
  • 在构造函数中

this的指向用简单的话来讲就是数组

谁调用,就指向谁

先看 处于被对象调用的方法中app

var obj = {
    name: '二狗子',
    bark: function(){
        console.log(this);   ==> obj  //    很明显,调用者是obj,按照上面的简单规则 “谁调用就指向谁” 因此这里的this == obj
        console.log('汪汪汪');
    }
};

obj.bark();

再来 处于普通函数中函数

var obj = {
    name: '二狗子',
    bark: function(){
        console.log(this);  ===> window //  不要觉得bark在obj里面定义的,因此this就是obj,记住javascript是在运行时才能肯定的,可是这里等于window,也许会让人有点意外,可是若是你知道了全局环境下全部的属性方法都是于window就不会奇怪了,因此这里其实隐藏了一个window,因此实际上是window.bark();这样调用的,在参照 “谁调用就指向谁” 因此这里的this == window
        console.log('汪汪汪');
    }
};

// 注意前面没有加obj
bark();

接着 在构造函数中this

构造函数其实跟普通函数没有任何区别,在没有使用new修饰符的时候,函数就是函数,只有加了new后,函数才是一个构造函数,是new赋予了函数的特殊能力让其进化成了构造函数code

func1和func2都是普普统统的函数
function func1(){}
function func2(){}

new func1();  // 嘭,一瞬间,func1有了新的使命,他成了一个构造函数

那么构造函数有什么用呢? 用处就是,他会返回一个对象对象

function func1(){
    this.name = '一号狗子';
}
function func2(){
    this.name = '二号狗子';
}

var dog = new func1();  // dog1得到了一个对象
var dog =     func2();  // dog2什么都没有,由于函数没有返回任何东西

当对函数使用new修饰符时,函数的内部的this的指向则是返回的那个对象,这是js引擎的背后的行为

call apply
call和apply说白了就是改变this指向的两个方法,这两个方法属于function类型,因此只要一个变量的原型链上有function,那么它就有call和apply方法
既然说道改变this指向,怎么改变呢?ip

咱们回到第一个例子,这里的this咱们已经知道了是指向obj,能改变吗?能,试试apply原型链

var obj = {
    name: '二狗子',
    bark: function(){
        console.log(this);   ==> obj
        console.log('汪汪汪');
    }
};

obj.bark();

// 第一个参数是你须要将this改指 的变量,后面则是须要传给func的参数,这里咱们没有给bark传,因此没写
// func.apply(context, arg...)
obj.bark.apply(window);

就这么简单,call也是同样的使用方式,只是call和apply处理传入参数的方式有一小点区别,
就是call()方法接受的是一个参数列表,而apply()方法接受的是一个包含多个参数的数组。

相关文章
相关标签/搜索