开开森森学前端之this

前言

你们好,今天咱们来探究下this,咱们都清楚一句话:this的指向取决因而谁调用它,接下来咱们来看几个例子。javascript

独立函数调用

var a = 2;
function foo(){
  console.log(this.a);
}
foo();//答案是多少呢
复制代码

解析:

这是最多见的独立函数调用。是谁调用了它?固然是window,window.foo嘛。因此this指向了window,window.a天然是2因此输出2java

对象调用

var a = 3;
function foo(){
  console.log(this.a);
}
var obj = {
  a:2,
  foo:foo
};
obj.foo();  //答案是多少呢
复制代码

解析:

是谁调用了foo函数?是obj。因此this指向了objthis.a天然是等于obj.a,等于2因此输出2面试

对象赋值调用

var a = 3;
function foo(){
  console.log(this.a);
}
var obj = {
  a:2,
  foo:foo
};
var func = obj.foo;
func ();   //答案是多少呢
复制代码

解析:

这道题输出3,这道题和刚刚上面的第二题有区别,func是对obj.foo的一个引用,实际上引用的仍是foo函数自己,因此func()foo()没两样,所以this指向的是window。打印出3也是符合this的指向取决因而谁调用它这个观点的。app

call调用

function foo(){
  console.log(this.a);
}
var obj = {
  a:2
};
foo.call(obj);   //答案是多少呢
复制代码

解析:

callapply会强制将this绑定到第一个参数上,foo.call(obj)能够理解为foo函数让obj来调用,因此this会指向obj因此输出2函数

new调用

var a = 2;
function foo(){
  this.a = 3;
}
var bar = new foo();
console.log(a);  //答案是多少呢
console.log(bar.a);  //答案是多少呢
复制代码

解析

这里的foo函数是经过new操做符调用的,它会自动执行如下步骤ui

一、建立一个全新的对象this

二、这个新对象会执行[[Prototype]]链接spa

三、这个新对象会绑定到函数调用的thiscode

四、若是函数没有返回其余对象,那么new表达式会自动返回这个新的对象 因此new来调用foo的时候,this指向了新的对象bar。所以this.a修改的是bar的属性。对象

因此a输出2,bar.a输出3

setTimeout调用

function foo(){
  setTimeout(function(){
    console.log(this.a);
  })
}
var obj = {
  a:2
};
foo.call(obj);  //undefined
复制代码

解析

输出的undefined,那是由于setTimeout传进的函数实际上是window在调用。而a没有被定义,因此输出undefined

setTimeout配合箭头函数调用

function foo(){
  setTimeout(()=>{
    console.log(this.a);
  })
}
var obj = {
  a:2
};
foo.call(obj);  //答案是多少呢
复制代码

解析

使用箭头函数后,打印出的值就成了2。它的this是属于foo()函数的做用域,而foo又是被obj调用的,因此会输出2。 如今大多数this问题应该都能解释了。

可是有一点要注意,严格模式下thisundefined

严格模式的this

var a = 2;
function foo(){
 "use strict"
  console.log(this.a);
}
foo()  //Uncaught TypeError: Cannot read property 'a' of undefined
复制代码

总结

好了,今天咱们讲了this相关面试题,你们能够多加练习,掌握了this的大多数用法以及状况的话,那么对于大多数题目应该是无压力的,固然我也但愿你们能够把this用到实际工做中,而不是为了面试而面试!

相关文章
相关标签/搜索