日期:2014-05-16  浏览次数:20423 次

javascript中的对象查找

近期群里常有人提一些简单的问题,比如发一段代码乱七八糟的代码,然后说里面某个变量是什么,比如这里就有个很好的例子:

function fn(arg) {
    alert(this.arg);
    alert(this);
}
fn(123);
var o = { fn: fn };
o.fn(123);

然后就可能有这样的问题:

为什么this.arg是undefined?为什么2次调用fn的this是不一样的?

为此,我觉得自己作为一个虽然不成熟的前端,对于一些自己力所能及的事情,还是应该传道授业解惑的。所以,这篇文章,计划从非常肤浅的层面上,来解释一下javascript中的对象查找是如何进行的。

注意,本篇文章只是从表象上来介绍对象查找这一行为的过程,文章中的观点并不全正确,甚至存在着一些谬误,但是这也是为了让初学者更好地理解对象查找这一过程。相信如果说得太过抽象、深入,反而会引起一些负面效果。如果有一天,你再回过来,发现这个文章说得并不那么正确,那么恭喜你,那个时候的你已经可以找到正确前进的道路,这篇中的错误也不会再对你有任何影响。

对象的分类

所谓对象查找,即在一段可执行代码的作用域内,找到一个当前需要的对象。在javascript中,需要进行查找的对象大致可以分为3种类型:

  • 变量查找,如foo++;,这里就会去查找一个叫作foo的变量。
  • 属性查找,如foo.bar++;,这里会去查找foo这个变量下的一个叫作bar的属性。
  • this查找,即针对this关键字的处理。

区分这3种类型的对象查找是首先要完成的任务,你可以基于以下原则进行判断:

  • 变量仅由变量名组成,即单独的foo、bar等。
  • 属性永远由2种形式去访问,即foo.barfoo['bar'],因此看到有“.”或“[]”即可当成是属性查找。
  • this就不用说了,好好的关键字。