加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

你不知道的 JavaScript - “this”。

(2008-04-21 19:30:47)
标签:

this

demo

window

作用域

函数

it

  

JavaScript 里的 this 到底指得是什么?很多人都会告诉你 this 指的是当前对象。这样理解对么?在大多数情况下确实没错。比如我们经常会在网页上写这样的 JavaScript:

 

http://www.cnblogs.com/Images/OutliningIndicators/None.gifJavaScript “this”。" /><input type="submit" value="提交" onclick="this.value='正在提交数据'" />

 

这里的this显然指的是当前对象,即这个提交按钮。通常,我们使用this的情况都与此类似。但是有什么情况不是这样的呢?

大家看看这个例子:

 

http://www.cnblogs.com/Images/dot.gifJavaScript “this”。" />{
http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gifJavaScript “this”。" />    console.log(
this
);
http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gifJavaScript “this”。" />}

http://www.cnblogs.com/Images/OutliningIndicators/None.gifJavaScript “this”。" />foo();
http://www.cnblogs.com/Images/OutliningIndicators/None.gifJavaScript “this”。" />
new foo();

 

比较一下 foo() 和 new foo() 的运行结果,你会发现,前者 this 指向的并非 foo 本身,而是当前页面的window对象,而后者才真正的指向foo。这是为什么呢?

其实这牵涉到JavaScript的一条重要特性,就是所谓的“闭包”。闭包这个概念说复杂也不复杂,但也不是简单到能用一两句话说清。偶会在以后的文章中深入探讨这个Javascript 最重要的特性。现在,我要告诉大家的是,因为闭包的存在,JavaScript中的作用域变得相当重要。

所谓的作用域,简单的说,就是创建一个函数时在什么环境下创建的。而this变量的值,如果没有指定的话,就是函数当前的作用域。

 

在前面的例子里,foo() 函数是在全局作用域(这里就是window对象),所以this的值是当前的window对象。而通过 new foo() 这样的形式,其实是创建了一个foo()的副本,并在这个副本上进行的操作,所以这里的this就是foo()的这个副本。

 

这样讲可能有点抽象,大家来看个实际的例子:

 

http://www.cnblogs.com/Images/OutliningIndicators/None.gifJavaScript “this”。" /><input type="button" id="aButton" value="demo" onclick="" />
http://www.cnblogs.com/Images/dot.gifJavaScript “this”。" />

http://www.cnblogs.com/Images/dot.gifJavaScript “this”。" />
{
http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gifJavaScript “this”。" />    
this.value =
 Math.random();
http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gifJavaScript “this”。" />}

http://www.cnblogs.com/Images/OutliningIndicators/None.gifJavaScript “this”。" />
</script>

 

如果直接调用demo() 函数,程序就会报错,因为demo函数是在window对象中定义的,所以demo的拥有者(作用域)是window,demo的this也是window。而window是没有value属性的,所以就报错了。

http://www.cnblogs.com/images/cnblogs_com/ruxpinsp1/132244/o_demo1.png

如果我们通过创建副本的方式,将这个函数的副本添加到一个HTML元素,那么他的所有者就成了这个元素,this也指代了这个元素:

 

http://www.cnblogs.com/Images/OutliningIndicators/None.gifJavaScript “this”。" />document.getElementByIdx("aButton").onclick = demo;

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有