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()
方法接受的是一个包含多个参数的数组。