首先this是什么? this就是对象 请看案例:
//nodejs环境中 console.log(this); //返回{} //浏览器环境 console.log(this); //返回windows对象作用:动态指定当前对象,使用当前对象的方法 那么怎么使用this呢? js中的对象或者方法具有this作用域 那么this有什么坑呢? 由于js原先的特性,this的作用域是在执行的时候确定的,这样就会导致this指向不明确 请看坑(所谓的坑就是内层函数不能访问外层的this,一般发生在回调函数的时候):
var name="global"; var test={ name:"test", showName:function(){ console.log(this.name) }, showArrow:function(){ setInterval(() => {console.log(this.name)}, 1000); }, showFun:function(){ setInterval(function(){console.log(this.name)}, 1000); } } test.showFun(); //输出undefined test.showArrow(); //输出test为什么输出undefined? 因为匿名函数中没有指定name,所以是undefined 解决方案: 一、使用es6中箭头函数 箭头函数中this:是在定义的时候确定的 实质: 箭头函数中根本没有this,它只会引用外层函数的this,也就是我们为了防止this指向不明确,经常采用的this赋值: var _self=this; 箭头函数相当于在内部采用了这一个策略,引用外层作用域
var bird={ name:'bird', speak:()=>{ //console.log(this); console.log("I am a "+this.name); } } var duck={ name:"duck", speak:function(){ console.log("I am a "+this.name); } } const type=(animal)=>{ if(typeof animal.speak == "function"){ animal.speak(); return true; } return false; } type(bird); type(duck);输出结果为:
I am a undefined I am a duck为什么呢? 因为箭头函数内部没有this,会向上寻找this,speak是一个函数,具有this,但是其this.name没有赋值,所以是undefined。 也就是 箭头函数寻找,最近的具有this作用域的对象
因为箭头函数内部没有this,我们在箭头函数内部打印出来,
{}可以看到是一个对象 二、使用bind,显式指定this作用对象
