this不仅仅是Javascript的核心内容,也是前端面试的重点,更是在工作中频繁出现的词,那么this是什么?到底this表达了什么?为什么要有this这个词?

彻底搞懂上下文this

1.1 this是什么?

小姐姐先在这里卖个关子,不直接回答上面的问题,我们先来看一个例子:

var 

从上述例子中我们得知:

对象被当作了参数传入了函数内部。运行结果为270,也就是说函数从外面接收信息,主要依靠参数,那么问题来了,如果不靠参数,函数能不能在外部获得信息???
答案就是上下文
上下文就是使信息进入函数内部的一种手段

现在我们改变一下上述例子的写法,不使用参数的方式,使用this进入到函数内部,

var 

那么运行的结果也为270,this就是函数的上下文,所以说函数的上下文,是除了参数以外的,最常用的使信息进入函数内部的一种手段。讲述完了this的出现,那么this是怎么被调用的呢?请继续看下面的内容。

1.2 this是啥取决于如何被调用

function定义的函数,this是什么,要看如何调用,而不是如何定义。

调用方式决定this,比如看下面的例子,有个obj对象,它有一个属性函数fn,里面有this,当题读到这时,一定不要激动!!!当函数没有调用的时候,就是Brandan Eich本人来了,都不知道this是谁,因为函数没有被调用。

var 

本题是f()圆括号调用的,所以上下文是window,运行结果为8,这个符合this的判断规则1,那么this有哪些判断规则呢?请接着继续看下面的内容。

1.3 七个this判断规则

规则1:函数直接用圆括号运行,上下文是window对象。

var 

上述例子中看到this,一定要淡定,必须看清楚函数是如何被调用的,那么题中,obj.fun()(),先来看obj.fun()它一运行得到的是一个匿名函数,此函数再圆括号调用即obj.fun()(),其实就是函数直接圆括号运行,所以上下文是window,运行结果为7。

规则2:对象打点调用函数,上下文是这个对象

var 

此题obj.fun()是对象打点调用函数,所以上下文是这个对象,即此题运行的结果取的是obj这个对象中a属性的值为3

规则3:数组(类数组对象)中枚举出函数,上下文是这个数组(类数组对象)

function 

函数fun2作为参数传入函数fun1中,类数组对象中枚举出函数,然后运行上下文是这个类数组对象,fun2函数里面的this是fun1的实际参数列表!,所以this.length的值为 5,arguments.length为2。

规则4:定时器调用函数,上下文是window

var 

定时器调用example函数,所以上下文是window,即运行结果为9。

规则5:被当作了事件处理函数,上下文是触发事件的DOM元素

<button id="button"></button>

var 

程序运行结果为[object HTMLButtonElement],即this是触发事件的button元素。

规则6:用new调用函数,上下文是函数体内秘密创建的空白对象

用new创建函数会经过4步走:
① 秘密创建空对象
② 将this绑定到这个空对象上
③ 执行语句
④ 返回这个对象

规则7: 用apply、call执行上下文

function 

先看foo()符合规则1:圆括号直接打点调用函数,上下文window,所以getLength.call(this.length),是作为getLength函数的上下文。又因为 foo()返回的是个立即执行函数,执行函数又返回的是个对象,所以,foo().info()即对象.info()符合规则2:对象打点调用函数,上下文是这个对象。即最后返回的是return对象中length函数的形参列表的长度,result的执行结果为3。

本题中一定要记住:函数的length是形参列表的长度。arguments.length是实参列表的长度。

另外需要知道,arguments.callee表示函数本身,arguments.callee.length也是形参列表的长度。

小结

今天分享了javascript的核心内容——this有关的知识点,希望这篇文章能帮助大家彻底搞懂上下文this,也希望大家能喜欢。如果有更好的建议或相关的经验欢迎大家在下面的评论中与我们一起分享。
如需转载,烦请注明出处:https://www.zhihu.com/people/aileenfeng/posts

此上下文中不允许函数定义。_彻底搞懂上下文this,轻松应对,一面就过!!!...相关推荐

  1. matlab输入指令错误怎么修改,在MATLAB中运行程序时,显示错误: 此上下文中不允许函数定义。 怎么修改?...

    点击查看在MATLAB中运行程序时,显示错误: 此上下文中不允许函数定义. 怎么修改?具体信息 答:MATLAB程序运行错误后,切换到MATLAB命令行中,观察命令行中的错误信息,确定错误原因. 1. ...

  2. 此上下文中不支持函数定义。请在代码文件中创建函数。_深入解析Python上下文管理器,让你不再迷茫!...

    1. 上下文管理器 一个类只要实现了 __enter__() 和 __exit__() 这个两个方法,通过该类创建的对象我们就称之为上下文管理器. 上下文管理器可以使用 with 语句,with语句之 ...

  3. 此上下文中不允许函数定义。_面试官:那我们来说说执行上下文吧

    当 JS 引擎处理一段脚本内容的时候,它是以怎样的顺序解析和执行的?脚本中的那些变量是何时被定义的?它们之间错综复杂的访问关系又是怎样创建和链接的?要解释这些问题,就必须了解 JS 执行上下文的概念. ...

  4. vscode 无法跳转到函数定义_玩转VS Code

    (以下快捷键操作针对 windows,括号内是针对 macOS) 代码编辑器--------高效能编程 学习新的编辑器的方法: 第一步:了解编辑器的快捷键和语言支持,快捷键值得多花时间: 第二步:开始 ...

  5. python查看函数定义_从函数内函数定义看python的函数实现

    一.问题 在C/C++中,函数的定义本质上是在编译阶段完成,而函数调用是由链接完成.但是对于python这种语言,函数的定义和调用都是由解释器在运行时完成,或者说,解释器在执行函数定义的时候,同样是生 ...

  6. 【C语言】函数的声明_函数定义_函数调用_函数递归 [函数的基本使用]

    文章目录 前言 1.函数是什么? 2.C语言中函数的分类 2.1 库函数 2.2 自定义函数 3.函数的参数 3.1 实际参数(实参): 3.2 形式参数(形参): 4.函数的调用 4.1 传值调用 ...

  7. vb6 combo根据index显示_彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index

    前言 最近,在项目中遇到一个关于CSS中元素z-index属性的问题,具体问题不太好描述,总结起来就是当给元素和父元素色设置position属性和z-index相关属性后,页面上渲染的元素层级结果和我 ...

  8. python协程详解_彻底搞懂python协程-第一篇(关键词1-4)

    任何复杂的概念或系统都不是凭空出现的,我们完全可以找到它的演化历程,寻根究底终会发现,其都是在一系列并不那么复杂的简单组件上发展演化而来! by 落花僧 本文通过一系列关键概念,逐步递进理解协程. 0 ...

  9. python from. import失败_彻底搞懂Python 中的 import 与 from import

    以下文章来源&作者:青南(谢乾坤) 摄影:产品经理:kingname 的第一套乐高 你好,我是谢乾坤,前网易高级数据挖掘工程师.现任微软最有价值专家(Python 方向),有6年 Python ...

最新文章

  1. 服务器信息采集协议,服务器信息采集
  2. 2.7 RMSprop-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  3. PR 简单使用(一)
  4. mysql的存储覆盖_mysql覆盖存储
  5. Android Theme 主题总结
  6. Leetcode每日一题:376.wiggle-subsequence(摆动的序列)
  7. C++新经典——C++从入门到精通
  8. 【三维装箱】基于matlab遗传和模拟退火算法求解三维装箱优化问题【含Matlab源码 031期】
  9. MessageBox用法大全
  10. python实现爱心代码
  11. u盘资料误删怎么恢复 怎样找回u盘里误删的文件
  12. 【vue】vue用了keep-alive生命周期只执行一次怎么办?
  13. Linux下浏览器的选择
  14. 2W公里,就换EBC刹车片?
  15. 虚拟计算服务器吗,云计算服务器是虚拟的吗
  16. AI纪事|深度学习保护濒危语言
  17. node-sass安装终极方案
  18. Mogafx美加对保有一定的区间震荡
  19. Android开发定位
  20. 基于springboot图书借阅挂失归还系统

热门文章

  1. UnrealEngine4 PBR Shading Model 概述
  2. UE4 移动平台游戏开发
  3. JNI 简明教程之手把手教你入门
  4. 阿里新一代分布式任务调度平台Schedulerx2.0破土而出...
  5. PHP如何获取文件行数
  6. 【云快讯】《微软Sharepoint 2016 Beta版发布,强化混合云搜索功能》
  7. android在activity中锁屏解锁后重走OnCreate的问题的解决办法
  8. Expression Blend 利用 SketchFlow 制作原型
  9. intellij mysql jdbc_intellij idea java项目中通过JDBC链接mysql
  10. python分析彩票_[博乐彩票网]福彩3D第2008277期和值和尾分析