首先声明,this并不需要’查找’这一个过程,this是在函数调用的时候就确定的。
function foo(){}
分别就函数的4中调用形式如何确定函数内的this.
1.Function Invocation Pattern
诸如’foo()’这样直接调用的形式,这种模式下,foo函数体中的this永远为Global对象,在浏览器中就是Window对象。
2.Method Invocation Pattern
诸如’foo.bar()’这样的形式,函数作为属性来调用,必然会有’.’或者’[]’这样的符号出现,那么函数中的this就是’.’或者’[‘符号前的对象,foo.bar()则bar函数中的this就是foo。
3.Constructor Pattern
诸如’new foo()’这种形式,带有new关键字出现。这种模式下,foo函数中的this永远指向new foo()返回的对象。
4.Apply Pattern
诸如’foo.call(ThisObject)’和’foo.apply(ThisObject)’这种模式,使用了函数内置的call和apply函数。这种模式中函数内部的this指向call和apply函数的第一个参数.如果传入的ThisObject是null或者undefined则函数的this指向global。
所以确定函数是哪种调用模式,那么确定函数内的this就很easy了.
另外一篇对this讲解的很透彻: