日期:2014-05-16 浏览次数:20451 次
近期群里常有人提一些简单的问题,比如发一段代码乱七八糟的代码,然后说里面某个变量是什么,比如这里就有个很好的例子:
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的属性。区分这3种类型的对象查找是首先要完成的任务,你可以基于以下原则进行判断:
foo.bar
和foo['bar']
,因此看到有“.”或“[]”即可当成是属性查找。