说道this,就不得不说到function,正是因为调用function的对象不同,才导致this的指向不同。
我们都明白function也是对象,function执行时是在某个特定的上下文中执行。上下文也就是一种环境,函数的运行是需要一些额外的信息来支撑的。
我先来看看function的核心方法call()
function say(content) { console.log("From " + this + ": Hello "+ content); } say.call("Bob", "World"); //==> From Bob: Hello World
- 函数执行时的this指向第一个参数
- 在上面这个特殊的上下文执行函数
- 通过call的方法,让say函数执行的this指向“Bob”,然后再将"world"传进去
function say(word) { console.log(world); } say("Hello world"); say.call(window, "Hello world"); 以上可以把say("Hello world")看做是say.call(window,"Hello world")的语法。
这个结论很重要,对于this的理解很有帮助
理解了这些,看看下面的代码
var person = { name : "caibirdme", run : function(time) { console.log(this.name + "has been running for over "+ time+ " minutes"); }}; person.run(30); //==> caibirdme has been running for over 30 minutes//等价于 person.run.call(person, 30); // the same
明白了这些,也就对this有了很深的理解