JavaScript中函数里this的值到底指向谁?如何理解上下文context?
2015-12-01 18:11
573 查看
先看下面的代码:
同样都是 f 函数,单独调用时this_obj的值是window对象,通过o对象调用时值确变为了o对象。那么如何理解函数定义是this的值是什么呢?
我的理解:
首先什么是上下文context ?
经常看到很多资料文档都有提到上下文,但是都不是太好理解。现在尝试吧自己的理解写出来,也算是梳理一下。
上下文 我把它理解为当前运行环境,程序运行时,程序的每条语句都有对应的上下文,即运行环境。
比如上面的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的值。
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的值。
相关文章推荐
- escape() of javascript
- js学习笔记之标准库
- JSF maven environment set up
- JSP标准标签库(JSTL)--JSTL简介与安装
- 半小时精通正则表达式-精华版
- JavaScript URL编码问题
- JS随机生成生成验证码
- 使用苹果原生的JSON数据解析浅析
- 安装package.js
- ELaticSearch——PlainElastic.net.dll 中的JsonNetSerializer
- 【学习笔记javascript设计模式与开发实践(策略模式)----5】
- JavaScript中读取和保存文件实例
- Zepto picLazyLoad Plugin,图片懒加载的Zepto插件
- [Javascript] BOM
- js大图匀速无缝滚动效果
- JSON 和 XML 优缺点的比较
- [Javascript] 闭包 closure
- JavaScript 的类型检测
- JS转换成带两位小数的数值
- JS中格式化日期