JavaScript中函数的上下文——this
1.上下文初步了解:
我们来研究一下函数的上下文(context),所谓的上下文就是指函数里面的this是谁。
当一个函数当做对象的方法被调用的时候,这个函数里面this表示这个对象:
<script type="text/javascript">var obj = {xingming: "爱前端",age : 2,sayHello : function(){alert("你好,我叫做" + this.xingming+ "!我的年龄是" + this.age + "岁");}}obj.sayHello(); //你好我叫做爱前端!我的年龄是2岁</script>
现在我们调用sayHello函数的时候,是通过obj打点调用的,所以现在这个sayHello函数的上下文就是obj对象。 即sayHello函数内部的this指向obj。
但是,千万不要认为写在对象里面的函数,上下文一定是这个对象!!
比如:
<script type="text/javascript">var obj = {xingming : "爱前端",age : 2,sayHello : function(){alert("你好,我叫做" + this.xingming + "!我的年龄是" + this.age + "岁");}}var fn = obj.sayHello; //拿出了这个函数fn(); //直接圆括号调用!!不是对象打点调用!你好,我叫做undefined!我的年龄是undefined岁。
</script>
浏览器运行结果:
因为圆括号调用函数,上下文是window对象。
函数的上下文是什么,取决于函数怎么调用,而不是函数如何定义。
函数的上下文是函数的调用时表现的性质,不是函数定义的时候写死的性质。
2.函数上下文遵循五个规律
2.1函数用圆括号调用,函数的上下文是window对象
<script type="text/javascript">function fun(){var a = 1;alert(this.a); //实际上访问的是window.a}var a = 2;fun(); //弹出2
</script>
函数function fun(){}的上下文是什么呢?不要看它怎么定义,要看它怎么调用。此时是fun()函数名加上圆括号直接调用,上下文就是window对象!
而我们知道:所有的全局变量都是window对象的属性,(注意:函数里面的局部变量,不是window的属性,不是任何东西的属性,它就是一个变量。)程序弹出666。
2.2函数如果作为一个对象的方法,对象打点调用,函数的上下文就是这个对象
比如下面的例子,我们把fun函数定义出来了,然后又把这个函数绑定给了obj对象的c属性:
<script type="text/javascript">function fun(){alert(this.a); //相当于弹出obj.a}//对象var obj = {"a" : 1,"b" : 2,//给这个对象增加一个方法,值就是fun函数"c" : fun }//我们要看清楚函数执行的时候,是怎么执行的。//现在不是圆括号直接执行,而是一个对象打点调用这个函数执行,所以函数的上下文是obj对象!obj.c(); //弹出1
</script>
调用的时候,是“对象.函数()”
此时根据规律,函数里面的this是这个对象。所以能够弹出1。
2.3函数是事件处理函数,函数的上下文就是触发这个事件的对象
下面我们定义了一个fun,然后把这个fun当做了3个DOM元素的事件处理函数:
<script type="text/javascript">//函数function fun(){this.style.background = "red";}var box1 = document.getElementById("box1");var box2 = document.getElementById("box2");var box3 = document.getElementById("box3");// 把同一个函数绑定给不同的对象// this就是点击谁就是谁box1.onclick = fun;box2.onclick = fun;box3.onclick = fun;
</script>
函数不会执行,直到用户点击了某一个div标签。此时点击谁,this就是谁!
2.4定时器调用函数,上下文是window对象
<script type="text/javascript">//函数function fun(){alert(this.a);}var a = 1;setInterval(fun,1000);
</script>
函数fun被定时器调用,此时函数的上下文就是window对象。每秒钟能弹出1.
2.5数组中存放的函数,被数组索引之后加圆括号调用,this就是这个数组
比如:
<script type="text/javascript">function fun(){alert(this === arr); //truealert(this.length); //3,因为数组的长度是3}var arr = [fun,1,2];arr[0]();
</script>
一定要敏感:
arr[0]();
此时这个函数是从数组中枚举出来然后加圆括号执行的,所以最终调用者可以认为是这个数组,上下文就是这个数组!
JavaScript中函数的上下文——this相关推荐
- JavaScript id_好程序员web前端分享Javascript中函数作为对象
好程序员web前端分享Javascript中函数作为对象,Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性, ...
- JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域
一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){var bar = 1;fn(); } var bar = 99; test(funct ...
- JavaScript中函数的length属性
JavaScript中函数的length属性 length是函数的一个属性 函数的length是js函数对象的一个属性,函数的length代表形参的个数(即有多少必传参数) 形参的数量不包括不包括剩余 ...
- JavaScript中函数里的arguments属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- JavaScript中函数的三种定义方法
JavaScript中函数定义的三种方法. 函数的三种定义方法分别是:函数定义语句.函数直接量表达式和Function()构造函数的方法.下面依次介绍这几种方法具体怎么实现. 1. 函数定义语句 // ...
- 以及其任何超类对此上下文都是未知的_web前端入门到实战:Javascript 中的「上下文」你只需要看这一篇
正文 上下文 是Javascript 中的一个比较重要的概念, 可能很多朋友对这个概念并不是很熟悉, 那换成「作用域」 和 「闭包」呢?是不是就很亲切了. 「作用域」和「闭包」 都是和「执行上下文」密 ...
- JavaScript中函数四种调用模式
目录 JS中函数的四种调用模式 函数调用模式 方法调用模式 构造器调用模式 上下文调用模式 JS中函数的四种调用模式 在函数的调用模式中感觉最大的区别就是: this指向 函数调用模式 即通过函数名直 ...
- javascript中函数的全解简介
来源:itelite <script language="javascript"> //切记特殊的两种函数声明方式 /* //Function 构造 var f=ne ...
- 了解javascript中函数执行顺序
我个人觉得一般人不会有这种写法,但艺不压身,呵呵.希望能帮到初学的朋友!大家一起进步! 首先列举出8个例子,然后例子的解答会在文章末尾贴出! 测试代码一: <script language=&q ...
- 参数 中_理解JavaScript中函数的参数
1,arguments JavaScript的函数的参数(arguments)在函数体的内部表现为一个类似数组的对象.就是它拥有数组的方法,却不是Array的实例. 例1 我们直接打印出argumen ...
最新文章
- 郁闷的时候看看这头驴,改变你的心态!
- 前端基础之JavaScript_2
- [HEOI2016TJOI2016]排序(二分+线段树)
- Vue:You may use special comments to disable some warnings.
- 在Struts2中实现登陆后跳转到登录前页面
- 强化学习(reinforcement learning)教程(后面是翻译)
- scala字符串变量替换
- (机器学习)痛苦的Caffe配置之路(win10 教育版+vs2015+cmaker+cpu_only+python接口)
- SecureCRT下载和设置
- 辞职信 求助编辑百科名片
- 数字证书理解(CA证书签名原理)
- 小学生计算机房的简笔画,小学生校园风景简笔画图片
- 编码器的集电极输出、电压输出、互补输出和线性驱动输出
- 哈佛结构与冯诺伊曼结构
- oracle脏读如何解决,关于脏读分析
- 满意度调查中的NPS题目怎么设置?
- CNN卷积核计算原理
- eNSP命令大全(所有命令)
- 打不开Eclipse,Eclipse闪退(已解决)
- 知识图谱从入门到应用——知识图谱的技术结构
热门文章
- 经典视觉SLAM框架
- 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
- C++链接和运行相关错误
- 解决DEFINE_string(result_path, result, Path for results) NameError:name 'os' is not defined
- docker获取数据库时间相差8小时_Docker部署服务时间相差8小时解决方法
- CSS3——CSS行内元素和块级元素的转换
- elipse开发android 如何查看报错信息
- L1-013 计算阶乘和 (10 分)—团体程序设计天梯赛
- 第六步_安装SSH服务
- RK3288_Android7.1调试红外遥控IR