真的了解this吗
function foo() {
var a = 2;
this.bar();
}
function bar() {
console.log( this.a );
}
foo(); // ReferenceError: a is not defined
上述这段经典错误代码,试图通过 this.bar() 来引用 bar() 函数。这是绝对不可能成功的。
那么this到底是什么呢?
首先要明白this是在运行时绑定的,其次this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。
this的调用位置
查找调用位置最终的是要分析调用栈,我们关心的调用位置就在当前正在执行的函数的前一个调用中。请看以下代码:
function baz() {
// 当前调用栈是:baz
// 因此,当前调用位置是全局作用域
console.log( "baz" );
bar(); // <-- bar 的调用位置
}
function bar() {
this全面解析 | 83
// 当前调用栈是 baz -> bar
// 因此,当前调用位置在 baz 中
console.log( "bar" );
foo(); // <-- foo 的调用位置
}
function foo() {
// 当前调用栈是 baz -> bar -> foo
// 因此,当前调用位置在 bar 中
console.log( "foo" );
}
baz(); // <-- baz 的调用位置
当然了这种方式操作起来繁琐而且易出错,下面介绍一种方法:
本文摘自:《你不知道的js》