js this
我们先来看一个例子:
> |
我们再来看一个例子:
<script> |
php中用$this来表示当前对象,
在js中用this来表示当前对象。
前者用class定义了一个类,后者用function来定义了一个构造函数。
为了便于开发者区分,在js中用首字母大写还是小写来区分一个函数是构造函数还是普通函数。
但是在js中,this无处不在,可不仅仅是在构造函数中才使用到哦。
在前面文章中的Array.prototype.uniq中就使用到了this。
this简单理解成:谁调用我,this就指向谁。
让我们再来看一道来自淘宝ued的面试题:
(http://ued.taobao.org/blog/2007/11/job_test_explanation/)
小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。
从这段描述可以得到以下对象:
function Dog() { |
小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),
一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。
请根据描述,按示例的形式用代码来实现(提示关键字: 继承,原型,setInterval)。
function MadDog() { |
以上是较为规范的一个解法,我们希望通过此题,
检查应聘者对JS的语言基础及面向对象开发的理解程度,其中的难点在于闭包的应用。
以上是淘宝官方内容。
让我们来看看大家通常的写法:
function MadDog() { |
运行之后,代码报错:this.wow is not a function。
很奇怪吧,我们已经通过prototype继承了Dog的方法,为何会说MadDog没有此方法呢?
问题就出在this的使用上,前面我们说过,this指向的是当前对象。
那么在setInterval(function(){})中,当前对象是谁呢?
setInterval是window全局对象的一个属性,setInterval=window.setInterval。
当你明白这点后,this指向的是谁呢?当然是window啊。
但window中确实没有wow这个方法啊,所以代码报错。
那么我们如何才能让this指向到正确的对象呢?
很简单,在调用setInterval之前,用一个别名把this存放起来,
在setInterval中访问这个别名不就相当于访问外面的this了吗?
借助js闭包的特性,我们得以成功在内部函数访问外部函数的变量。
怎么样,很简单吧,万变不离其宗。
友情提示:使用定时器时小心点哦,这玩意是最容易出错的地方。