先看下面的代码:
var f = function(){
var this_obj = this;
}
var o={name:"o"}
o.f = f;
f(); //此时调用时this_obj的值是window对象
o.f();//此时调用时this_obj的值是o对象
同样都是 f 函数,单独调用时this_obj的值是window对象,通过o对象调用时值确变为了o对象。那么如何理解函数定义是this的值是什么呢?
我的理解:
首先什么是上下文context ?
经常看到很多资料文档都有提到上下文,但是都不是太好理解。现在尝试吧自己的理解写出来,也算是梳理一下。
上下文 我把它理解为当前运行环境,程序运行时,程序的每条语句都有对应的上下文,即运行环境。
//eg1. 定义一个全局变量
var global_var = "global";
<pre name="code" class="javascript">var this_obj = this;
比如上面的eg1. 可以想象一下语句执行前:有个上下文对象,名称是_context,上下文对象是window对象,即:_context= window。
语句执行后,定义了一个全局变量,即 window.global_val 。
这样在接下来的代码使用global_val变量时,就会访问上下文对象中查找相应的变量 _context.global_val。
直接调用函数f(),此时函数体内的上下文对象就是window。
对象o调用f函数,即:o.f() 时,函数体内的上下文对象就是window.o对象。
o.test.f()函数体内的上下文对象就是window.o.test 对象。
this的值就是运行到this代码位置时上下文所对应的上下文对象。函数定义是并没有运行this_obj = this语句,所以函数定义是this_obj对象还未定义,他的值是undefined,需要在函数调用时,边解释边执行,执行this_obj = this时才分析调用函数是的上下文。才能确定this_obj的值。