当前位置: 首页 > news >正文

this 绑定题目简析

题目内容

请写出输出内容

var fullname = "aaa";

var obj = {
  fullname: "bbb",
  getFullName: () => this.fullname,
  prop: {
    fullname: "ccc",
    getFullName: function() {
      return this.fullname;
    }
  }
};

console.log(obj.prop.getFullName());

console.log(obj.getFullName());

var func1 = obj.prop.getFullName;
console.log(func1());

var func2 = obj.getFullName;
console.log(func2());
复制代码

题目分析

很显然,这道题就是在考察this 绑定的问题。来复习一下关于 this 的知识点

在绝大多数情况下,函数的调用方式决定了this的值。this不能在执行期间被赋值,并且在每次函数被调用时this的值也可能会不同。

简单说就是this 会指向调用者的对象

so easy,答案很简单

第一,调用者是 obj.prop, 应该是 ccc

第二和第四,因为绑定了 obj,所以都是 bbb

第三,调用者是 window,所以是 aaa

"ccc", "bbb", "aaa", "bbb";
复制代码

等等,是不是太顺利了,果然翻开答案一看

"ccc", "aaa", "aaa", "aaa";
复制代码

诶?箭头函数不是绑定父级作用域的么,难道出现了幻觉?为什么会绑定到 window 上呢?

先查一下 MDN,在箭头函数中,this 与封闭词法环境的 this 保持一致

那好,先来查一下封闭词法环境(enclosing lexical context)是什么东东。

A function serves as a closure in JavaScript, and thus creates a scope, so that (for example) a variable defined exclusively within the function cannot be accessed from outside the function or within other functions

函数在JavaScript中被解析为一个闭包,从而创建了一个作用域,使其在一个函数内定义的变量不能从函数外访问或从其他函数内访问。

那么难道是说只有函数才能创建作用域,其他变量都是不行的么?我们来验证一下

var fullname = "aaa";

var obj = {
  fullname: "bbb",
  prop: {
    fullname: "ccc",
    getFullName: () => this.fullname
  }
};
console.log(obj.prop.getFullName());

function A() {
  this.fullname = "bbb";
}
var a = new A();
a.getFullName = () => this.fullname;
console.log(a.getFullName());

// 'aaa' 'aaa'
复制代码

结果表明,不管是字面量还是 new 出来的对象都是无法创建作用域的

那么问题来了 this 的作用域在会随着上层函数的作用域变化而变化么?让我们来验证一下

var fullname = "aaa";

var obj = {
  fullname: "bbb",
  getFullName: function() {
    return (() => this.fullname)();
  }
};

console.log(obj.getFullName());
var getFullName = obj.getFullName;
console.log(getFullName());

// 'bbb', 'aaa'
复制代码

答案是肯定的。好了,新知识 get 到手。

总结

箭头函数的 this 指向父级函数的 this对象无法创建作用域

最后来复习一下关于 this 的相关知识,这里祭出MDN 大法

  1. 在全局执行环境中(在任何函数体外部)this 都指向全局对象。
  2. 在函数内部,this 的值取决于函数被调用的方式。
  3. 当函数作为对象里的方法被调用时,它们的 this 是调用该函数的对象。
  4. 当一个函数用作构造函数时(使用 new 关键字),它的 this 被绑定到正在构造的新对象。
  5. 当函数被用作事件处理函数时,它的 this 指向触发事件的元素。
  6. 当代码被内联 on-event 处理函数调用时,它的 this 指向监听器所在的 DOM 元素:
  7. 在箭头函数中,this 与封闭词法环境的 this 保持一致

相关文章:

  • express如何解决request entity too large问题
  • idea 添加yuicompressor压缩js/css
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 全局Threshold和动态阈值分割Dyn_Threshold的应用场景
  • Streaming源码解读 mapWithState-2
  • 你真的知道 == 和 equals 的区别吗?
  • 关于错误提示:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决方案...
  • 【c++进阶:c++ algorithm的常用函数】
  • (转) RFS+AutoItLibrary测试web对话框
  • 刚刚接触python的感想
  • linux下使用hiredis异步API实现sub/pub消息订阅和发布的功能
  • 第70届(2019)IMO中国国家队选拔考试试题
  • xml编码格式在tomcat下运行出错,eclipse里面直接运行没有问题
  • 微服务架构 SpringCloud(二)Eureka(服务注册和服务发现基础篇)
  • Android图片缓存之Glide进阶
  • php的引用
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • ECS应用管理最佳实践
  • JavaScript HTML DOM
  • JavaScript新鲜事·第5期
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • October CMS - 快速入门 9 Images And Galleries
  • Swift 中的尾递归和蹦床
  • Vue小说阅读器(仿追书神器)
  • 动态魔术使用DBMS_SQL
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 目录与文件属性:编写ls
  • 驱动程序原理
  • 消息队列系列二(IOT中消息队列的应用)
  • 一文看透浏览器架构
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (七)Java对象在Hibernate持久化层的状态
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转)http-server应用
  • (转)iOS字体
  • (转)大型网站架构演变和知识体系
  • *1 计算机基础和操作系统基础及几大协议
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net(C#)常用转换byte转uint32、byte转float等
  • :O)修改linux硬件时间
  • @ConfigurationProperties注解对数据的自动封装
  • @RequestMapping处理请求异常
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [100天算法】-目标和(day 79)
  • [2016.7 test.5] T1
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记