博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
this 绑定题目简析
阅读量:7066 次
发布时间:2019-06-28

本文共 2070 字,大约阅读时间需要 6 分钟。

题目内容

请写出输出内容

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 保持一致

转载地址:http://cwoll.baihongyu.com/

你可能感兴趣的文章
又拍云张聪谈安全、HTTPS、自定义、CDN的未来趋势
查看>>
腾讯58篇论文入选CVPR 2019,涵盖视觉对抗学习等方向
查看>>
ASP.NET SignalR增加Azure支持
查看>>
Raspberry Pi Zero发布,一台5美元的电脑
查看>>
IBM和Lightbend宣布构建新认知开发平台的战略
查看>>
GitHub引入依赖图和安全预警
查看>>
Visual Studio 2017 15.7全面支持C++17
查看>>
BAT集体升级云事业部,这背后都藏着哪些“小心思”?
查看>>
阿里妈妈新突破:深度树匹配如何扛住千万级推荐系统压力
查看>>
微服务之旅的经验分享
查看>>
范凯:一个二次创业者的失败
查看>>
云时代的开源软件收入模式
查看>>
联合国儿童基金会投资六家区块链初创企业,目标是解决“全球性挑战”
查看>>
你以为AlphaGo只是下围棋厉害?不,它还能用来优化金融交易策略参数
查看>>
More than React(二)组件对复用性有害?
查看>>
又拍云CDN再出力作,三驾马车为视频护航
查看>>
IBM发布Open Liberty 18.0.0.4,支持MicroProfile 2.1和反应性扩展框架
查看>>
编辑器领域正发生变革?从面试看Visual Studio Code的崛起
查看>>
省掉1/3的回归测试:Facebook用机器学习自动选择测试策略
查看>>
RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例
查看>>