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相关推荐

  1. JavaScript id_好程序员web前端分享Javascript中函数作为对象

    好程序员web前端分享Javascript中函数作为对象,Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性, ...

  2. JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域

    一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){var bar = 1;fn(); } var bar = 99; test(funct ...

  3. JavaScript中函数的length属性

    JavaScript中函数的length属性 length是函数的一个属性 函数的length是js函数对象的一个属性,函数的length代表形参的个数(即有多少必传参数) 形参的数量不包括不包括剩余 ...

  4. JavaScript中函数里的arguments属性

    <!DOCTYPE html> <html lang="en">     <head>         <meta charset=&qu ...

  5. JavaScript中函数的三种定义方法

    JavaScript中函数定义的三种方法. 函数的三种定义方法分别是:函数定义语句.函数直接量表达式和Function()构造函数的方法.下面依次介绍这几种方法具体怎么实现. 1. 函数定义语句 // ...

  6. 以及其任何超类对此上下文都是未知的_web前端入门到实战:Javascript 中的「上下文」你只需要看这一篇

    正文 上下文 是Javascript 中的一个比较重要的概念, 可能很多朋友对这个概念并不是很熟悉, 那换成「作用域」 和 「闭包」呢?是不是就很亲切了. 「作用域」和「闭包」 都是和「执行上下文」密 ...

  7. JavaScript中函数四种调用模式

    目录 JS中函数的四种调用模式 函数调用模式 方法调用模式 构造器调用模式 上下文调用模式 JS中函数的四种调用模式 在函数的调用模式中感觉最大的区别就是: this指向 函数调用模式 即通过函数名直 ...

  8. javascript中函数的全解简介

    来源:itelite <script  language="javascript"> //切记特殊的两种函数声明方式 /* //Function 构造 var f=ne ...

  9. 了解javascript中函数执行顺序

    我个人觉得一般人不会有这种写法,但艺不压身,呵呵.希望能帮到初学的朋友!大家一起进步! 首先列举出8个例子,然后例子的解答会在文章末尾贴出! 测试代码一: <script language=&q ...

  10. 参数 中_理解JavaScript中函数的参数

    1,arguments JavaScript的函数的参数(arguments)在函数体的内部表现为一个类似数组的对象.就是它拥有数组的方法,却不是Array的实例. 例1 我们直接打印出argumen ...

最新文章

  1. 郁闷的时候看看这头驴,改变你的心态!
  2. 前端基础之JavaScript_2
  3. [HEOI2016TJOI2016]排序(二分+线段树)
  4. Vue:You may use special comments to disable some warnings.
  5. 在Struts2中实现登陆后跳转到登录前页面
  6. 强化学习(reinforcement learning)教程(后面是翻译)
  7. scala字符串变量替换
  8. (机器学习)痛苦的Caffe配置之路(win10 教育版+vs2015+cmaker+cpu_only+python接口)
  9. SecureCRT下载和设置
  10. 辞职信 求助编辑百科名片
  11. 数字证书理解(CA证书签名原理)
  12. 小学生计算机房的简笔画,小学生校园风景简笔画图片
  13. 编码器的集电极输出、电压输出、互补输出和线性驱动输出
  14. 哈佛结构与冯诺伊曼结构
  15. oracle脏读如何解决,关于脏读分析
  16. 满意度调查中的NPS题目怎么设置?
  17. CNN卷积核计算原理
  18. eNSP命令大全(所有命令)
  19. 打不开Eclipse,Eclipse闪退(已解决)
  20. 知识图谱从入门到应用——知识图谱的技术结构

热门文章

  1. 经典视觉SLAM框架
  2. 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
  3. C++链接和运行相关错误
  4. 解决DEFINE_string(result_path, result, Path for results) NameError:name 'os' is not defined
  5. docker获取数据库时间相差8小时_Docker部署服务时间相差8小时解决方法
  6. CSS3——CSS行内元素和块级元素的转换
  7. elipse开发android 如何查看报错信息
  8. L1-013 计算阶乘和 (10 分)—团体程序设计天梯赛
  9. 第六步_安装SSH服务
  10. RK3288_Android7.1调试红外遥控IR