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

this在方法赋值过程中无法保持(隐式丢失)

在看《高级程序设计》(我的红宝书) P.183页时遇到下面一个问题

var name = "77";
var obj = {
  name: "88",
  getName: function () {
    return this.name;
  } 
};
(obj.getName = obj.getName)();  //返回全局变量 77

这个问题看起来好像有点奇葩,其实它可以从以下两个方面切入。

一、  在于obj.getName = obj.getName这个赋值的问题。我们可以先看一下规范对 a = b; 的解释,它其实发生了四步操作:

  1. 计算表达式a,得到a的地址refa;
  2. 计算表达式b, 得到b的值valueb;
  3. 将valueb赋给refa。
  4. 返回valueb

从上面的赋值过程中我们可以看到 obj.getName = obj.getName 会返回第二个 obj.getName 所指向的函数表达式。

于是就可以将(obj.getName = obj.getName)()视作全局函数。这个问题便可以看做

var name = "77";
var obj = {
  name: "88",
  getName: function () {
    return this.name;
  } 
};
var fn = obj.getName;
fn();     //返回全局变量 77

二、this的值基于调用的位置

this是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用位置(也就是函数的调用方式)。S的解释器是怎么知道this到底指向谁的(排除掉call和apply改变this)?重点就在于这个  . 号,有了  . ,他就知道是谁在调用,自然就会把this指向这个调用者。而上面那种写法,就直接调用了一个函数,没有  .,他自然不知道this是谁,它在全局中被调用,所以默认就是window了。

所以在全局中调用函数的时候 this 指向window,所以他会返回 77,而不是88.

 )

转载于:https://www.cnblogs.com/nanshanlaoyao/p/5910645.html

相关文章:

  • (三)uboot源码分析
  • Swift - 数组排序方法(附样例)
  • Image控件Stretch属性
  • C语言学习笔记--递归函数
  • UML-用例
  • 【Apache大系】Apache服务器面面观
  • MongoDB:实体对象(javabean)转DBObject
  • 关于TCP/IP协议
  • 【Python开发】Python PIL ImageDraw 和ImageFont模块学习
  • CSS学习(一)
  • 问题
  • jquery登录的异步验证
  • for循环的嵌套
  • 关于cmd下使用taskkill无法终止进程名包含空格的进程的解决方案
  • Hibernate —— Entity.hbm.xml
  • 「面试题」如何实现一个圣杯布局?
  • 【剑指offer】让抽象问题具体化
  • ES6 学习笔记(一)let,const和解构赋值
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Markdown 语法简单说明
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从零开始在ubuntu上搭建node开发环境
  • 读懂package.json -- 依赖管理
  • 观察者模式实现非直接耦合
  • 面试遇到的一些题
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何选择开源的机器学习框架?
  • 什么软件可以剪辑音乐?
  • 我感觉这是史上最牛的防sql注入方法类
  • 阿里云API、SDK和CLI应用实践方案
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​马来语翻译中文去哪比较好?
  • #LLM入门|Prompt#3.3_存储_Memory
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (新)网络工程师考点串讲与真题详解
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • .apk文件,IIS不支持下载解决
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 材料检测系统崩溃分析
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 调用php,php 调用.net com组件 --
  • .Net 垃圾回收机制原理(二)
  • .NET的微型Web框架 Nancy
  • .NET连接MongoDB数据库实例教程
  • .NET连接数据库方式
  • .NET使用存储过程实现对数据库的增删改查
  • :如何用SQL脚本保存存储过程返回的结果集