RefereceType与this指向

【solidity入门】5. 引用类型 Reference Type (本文是学习WTF学院后记的笔记) 引用类型 Reference Type: 1. 数组 array:定义、分类、创建规则、数组成员 2. 结构体 struct:定义新类型、赋值的两种方法 阅读详情

引用类型(Reference Type)

这个过程是用来模拟js引擎内部工作机制,并不是真正代码实现。
简介:
此引用类型不是数据的引用类型,而是一种规范类型,他主要是一个指代,代替一个标识符或属性的表示方式,你可以将引用类型就看成是一个标识符的一种表示方式,保存了标识符的一些信息,需要真实值时又可以通过它找到真实值。

注: 标识符就是变量名,函数名,函数参数名和全局对象中未识别的属性名

我们用伪代码的形式来表示引用类型的结构,看成是拥有两个属性的对象:

  1. 属性base,即标识符所属的那个对象
  2. 标识符名(或者叫属性名)
var valueOfReferenceType = {
    base: <base object>,
    propertyName: <property name>
};

引用类型的使用情景有二

  1. 当我们处理一个标识符时会返回引用类型
  2. 在处理一个属性访问器时会返回引用类型

在该过程中,总是返回一个引用类型的值

示列

var foo = 10;
function bar(){}

在操作的中间结果中,引用类型值对应的情况如下:

var fooReference = {
  base: global,
  propertyName: 'foo'
};
 
var barReference = {
  base: global,
  propertyName: 'bar'
};

在js中所有标识符都有所属对象,在执行环境中有个变量对象来保存环境中的标识符。

所以引用类型的base:
在全局上下文中,毋庸置疑,base === globalVO === gloabal
在函数的执行上下文中,base === VO/AO

但处理对象属性是:
这个更是简单,base === owerObject

用类型只是一个指代,它并不保存真正的值。当需要真正的值时,可以通过内部一系列算法,可以得到。这个算法,我们可以用简单的伪代码来描述:

function GetValue(value) {

  if (Type(value) != Reference) {
    return value;
  }

  var base = GetBase(value);

  if (base === null) {
    throw new ReferenceError;
  }

  return base.[[Get]](GetPropertyName(value));

}

内部的[[get]]方法返回对象属性的真正值,包括对原型链中继承的属性分析。

GetValue(fooReference); // 10
GetValue(barReference); // function object "bar"

我们获取引用类型的值时,一般是进行赋值、参与运算、或调用时都会触发GetValue获取真正值。

注意: 通过GetValue获取到的值不再是引用类型

访问属性有两种语法: 以点(.)语法或者括号语法([])

foo.bar();
foo['bar']();

在中间计算的引用类型的值为:

var fooBarReference = {
  base: foo,
  propertyName: 'bar'
};
 
GetValue(fooBarReference); // function object "bar"

一个函数中确定this值的通用规则如下:
在一个函数上下文中,this由调用者提供,由函数的调用方式来决定。如果调用括号()的左边是引用类型的值,this指向引用值的base对象(baseObject),在不适引用类型的情况下,值为null。不过,实际不存在this值为null的情况下,因为this值为null时,其值会被隐式转换成全局对象。注:ES5中,已经不强迫转换成全局对象了,而是赋值undefined。

我们看看例子中的表现:
(1) 调用括号左边是引用类型的值
this指向base,找到base即可。如果是全局变量下申明的,那就指向全局对象。

var myObject = {
     foo : function(){
            console.log(this);
      } 
}
myObject.foo(); //毫无疑问,这个foo的base是myObject,故foo方法中的this指向myObject。

同样,使用属性访问器:this也指向base

var foo = {
  bar: function () {
    return this;
  }
};
 
foo.bar(); // foo

但是以另一种形式调用函数,我们得到其他的this值

var test = foo.bar;
test(); // global

因为test作为global的属性,因此生成的引用类型不和上面一样,其base所属对象是global

var testReference = {
  base: global,
  propertyName: 'test'
};

(2)调用括号左边是引用类型的值,不过这个值为null

function myFunction() {
     var foo = function(){
            console.log(this);
      } 
       foo();    //AO.foo() => null.foo()
}
myFunction(); //输出:Window {top: Window, window: Window...}

当一个内部函数被调用时,这个内部函数的base应该是当前执行上下文中活动对象(AO),但是在javascript内部在AO作为base时,都当做null处理,javascript当然不允许this为null的情况发生,所有就将base设置为global对象(这是前文this函数调用模式中设计错误的源头)。所以在这情况下,this都指向全局对象。

(3)调用括号左边不是引用类型的值

//简单点的例子
(function () {
  console.log(this); // null => global
})();
//复杂些的例子
var foo = {
  bar: function () {
    console.log(this);
  }
};

foo.bar(); // Reference, OK => foo
(foo.bar)(); // Reference, OK => foo

(foo.bar = foo.bar)(); // global
(false || foo.bar)(); // global
(foo.bar, foo.bar)(); // global

当调用括号的左边不是引用类型而是其它类型,this自动设置为null,结果为全局对象

第一个例子中,立即函数,它的函数调用小括号左边是一个表达式,不是一个引用。

第二个例子复杂了许多,我们来一个个分析:

foo.bar(),这个没有疑问,base为foo,this指向foo。

(foo.bar)(),这里用到了一个小括号,它在这起到分组符作用,也就是它不会迫使引用类型执行GetValue方法,其执行结果,跟上面一模一样。

后面三个,小括号里面依次是赋值运算、或运算和逗号运算,它们都会迫使引用类型执行GetValue方法,从而返回一个函数对象。这样,函数调用小括号左边就不再是引用类型了,所有,this都是指向全局对象的

转载于:
https://www.jb51.net/article/44576.htm
https://www.cnblogs.com/TomXu/archive/2012/01/17/2310479.html

ABAP 引用类型(Reference Type)介绍 除了之前一篇文章什么是 ABAP Field Symbol介绍的 Field Symbol 以外,引用类型(Reference Type) 是 ABAP 编程语言里另一个很重要的数据类型。 让我们还是通过实际例子来理解。 下面这行简单的代码,定义了一个整型变量 lv1, 值为1. 紧接着,我们将其的值改为 2. 最后打印输出,lv1 的值为2. 除了这种通过赋值符号 = 给变量直接复制的方式之外,我们还可以通过引用变量来间接完成。 下列代码第 14 行,我定义了一个引用类型的变量 lr,类型为 REF T 阅读详情

相关推荐

Foxglove Studio实战:5步搞定自动驾驶数据可视化(附避坑指南)

本文详细介绍了如何使用Foxglove Studio高效搭建自动驾驶数据可视化工作流。通过五个核心步骤:环境准备、数据导入、面板搭建、交互分析与自动化集成,帮助开发者快速掌握这一专为机器人系统设计的开源平台。文章重点解析了其与ROS/ROS 2、MCAP等数据源的无缝对接,以及3D点云、多传感器融合、团队标注等核心功能,并附有实用的性能优化与避坑指南,旨在提升算法调试与团队协作效率。

d3e4f的博客 338

Java-数据类型(基本类型和引用类型)

数据类型分为两类:基本类型(Primitive Type) 和引用类型(Reference Type)。名称含义数据分配基本类型基本类型包括boolean类型和数值类型。数值类型有整数类型和浮点类型。整数类型包括 byte、short、int、long、char,浮点类型包括float和double。原始数据类型变量的“变量分配”与“数据分配”是在一起的(都在方法区或栈内存或堆内存)引用类型引用类型包括类、接口和数组类型,还有一种特殊的null类型。

yueerba126的博客 4303

SAP SD RRB实战:从DIP参数文件到DP90/DP91开票的完整链路解析

本文详细解析了SAP SD模块中RRB(Resource-related Billing)业务场景的完整链路,从DIP参数文件配置到DP90/DP91开票操作。通过实战案例分享DIP参数文件的核心配置技巧、特性设置及物料决定要点,帮助用户掌握动态开票的关键技术,提升SAP SD RRB的实施效率。

weixin_26833939的博客 378

Endnote Reference Type

根据GB3469-83《文献类型与文献载体代码》规定,以单字母标识: M——专著(含古籍中的史、志论著) C——论文集 N——报纸文章 J——期刊文章 D——学位论文 R——研究报告 S——标准 P——专利 A——专著、论文集中的析出文献 Z——其他未说明的文献类型 电子文献类型以双字母作为标识: DB——数据库 CP——计算机程序 E...

奶茶也青春的博客 1万+

【Diffusion分割】医学图像分割中去噪扩散技术

扩散模型(DPM)在图像生成方面表现出了卓越的性能,其性能往往优于其他生成模型。自其问世以来,强大的噪声-图像去噪管道已被扩展到各种判别任务中,包括图像分割。在医学成像中,图像往往是大型三维扫描图像,由于内存消耗大、迭代采样过程耗时,使用 DPM 对一幅图像进行分割的效率极低。在这项工作中,我们提出了一种(LDSeg),可在潜空间中执行扩散,用于医学影像分割。我们。潜空间条件扩散不仅能确保对多标签对象进行精确的 n-D 图像分割,还能缓解基于 DPM 的传统分割法的主要潜在问题:(。

qq_43583311的博客 1171

使用Transformer实现自动调制识别(RML2018)

image_size = 1024 # resize重置输入大小patch_size = 16 # 从输入图片中将被提取的块大小# 分成 num_patches 个块num_patches = (image_size // patch_size) #(72/6)**2 横着裁剪),],return x})

QAQIknow的博客 1324

Java 只有引用类型(reference type)

学过java的朋友一定听过这个概念,java设计者将java的类型分为基本类型(int、string、double、long等)和引用类型(对象),基本类型使用时,是值传递,而对象类型使用时,是引用传递。但,这两者在本质上,真的有区别吗?其实,Java 只有引用类型(reference type)!为什么这么说呢?在java中,没有指针的概念,对于基本类型,引入了常量池的概念。这其实是为了效率的优化(叫做 inlining),在实现上,确实是通过值进行直接传递的。java不会对值进行改变,而是直接修改地址。

了迹奇有没 1060

自然语言处理之机器翻译:Transformer:Transformer在低资源语言翻译中的应用

Transformer模型是自然语言处理领域的一个重要突破,由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN)的序列依赖性,采用自注意力机制(Self-Attention)处理输入序列,极大地提高了训练效率和模型性能。

zhubeibei168的博客 1015

JavaScript Reference Type类型解读

研究意义 当我们在读取一个属性的时候,比如在obj.method()中,.返回的准确来说不是属性的值,而是一个特殊的Reference Type类型的值,在这个其中存着属性的值和它的来源对象。 初步解析 Reference Type是ECMA中的一个"规范类型"。但是在外部是不能直接使用Reference Type,所以它一直被用于JavaScript的内部。 Reference Type本身是一个三个值的组合(base,name,strict),其中: base 是对象。 name 是属性名。 stri

FengChen的进阶之路 1772

OpenClaw小白使用全攻略

OpenClaw全能技能解锁指南:从基础到进阶 摘要: 本文提供OpenClaw AI智能体的完整使用教程,帮助用户从安装后"不知道如何用"到熟练掌握核心功能。教程包含:1)控制台5大区域详解和3个必做初始化设置;2)文件管理、浏览器自动化、文档生成等5大基础功能实操,每个功能配有详细操作步骤、指令模板和效果演示;3)10+高频场景解决方案,如整理文件、搜集资料、写总结等;4)进阶技巧和常见问题解答。通过清晰的图文指引,即使电脑小白也能快速上手,实现办公自动化、提升工作效率。

通俗易懂学IT 3060

YOLOv13改进策略【注意力机制篇】| ICASSP 2023 EMA 高效多尺度注意力,跨空间学习提高远距离建模依赖

ICASSP 2023 EMA 高效多尺度注意力在 YOLOv13 的接入实战:跨空间学习提升远距离依赖建模,含原理图解、完整代码、yaml 配置与实测参数量对比(ultralytics 8.3.63)。

qq_53329130的博客 935

JavaScript Reference Type解读

Reference Type 是语言内部的一个类型。存储方式引用类型的值在内存中的存储分为两部分,一部分是对象本身,存储在堆(heap)中;另一部分是对象的引用地址,存储在栈(stack)中。变量实际上存储的是这个引用地址。赋值了对象的变量存储的不是对象本身,而是该对象“在内存中的地址”。换句话说就是对该对象的“引用”。引用共享对象是“通过引用”存储和复制的。传递方式在函数传参时,引用类型是按引用传递。这意味着函数内部对参数的修改会影响到原始的对象或数组。可变性引用类型的值是可变的。

咸鱼滚滚 1516

以太网MII、RMII、GMII、RGMII(三)

RMII接口收发的数据位宽为2bit,因此管脚数目大为减少,在高密端口PHY中应用较多,但是由于其是MAC和PHY共用一个参考时钟,接口之间的距离不能太远;一般的GMII接口都有两个发送参考时钟:TX_CLK和GTX_CLK,两者的方向是不一样的,前者有PHY提供(同MII),后者由MAC或外部参考时钟源提供,绝大多数GMII接口都是兼容MII接口的,在用作MII模式时,使用TX_CLK和8根数据线中的4根。MII接口中的接收时钟和发送时钟是分开的,而且都是由PHY芯片提供给MAC芯片的。

qq_42357877的博客 2333

学习open62541 --- [20] 标准Reference类型

在OPC UA Server中,所有Node之间都是使用Reference进行连接的。Reference是分类的,在之前的系列文章中,我们也已经见过几种Reference了,本文就专门讨论所有标准Rference类型。 一 Reference的使用方式 如果看过前面的系列文章,那么就会对Reference的使用方式有一定的理解,如下图, 节点A通过一个Reference指向B,那么对于这个Re...

爱就是是恒久忍耐的专栏 4552

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

c++引用类型 reference type

在C++中,引用是一种特殊的类型,它提供了对另一个变量(即它所引用的对象)的别名。一旦一个引用被初始化为一个对象,它就不能被重新绑定到另一个对象。引用必须在声明时初始化,并且一旦初始化后,就不能改变它所引用的对象。引用类型的主要用途包括:函数参数传递:通过引用传递参数可以避免复制大型对象,从而提高效率。函数返回值:通过引用返回对象可以避免复制,并允许修改原始对象。别名:为变量提供别名,以便在代码的不同部分以不同的名字访问同一个对象。

2301_77005288的博客 550

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Mystery of Walrus(介绍primitive type和reference type)

primitive type(基本类型) 8种基本类型:byte, short, int, long, float, double, boolean, char first:declaring a variable for example:int type(declaring an int sets aside a "box"of 32bits double type(a box of 64bits) java并不在这些“盒子”里留下什么东西,它只是开辟了一个数据盒,可以将这个盒子理解为(a huge s

yanlingyun0210的博客 759

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TypeReference简单了解及使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 最近项目中使用到了TypeReference,发现自己使用了这么长时间的fastjson竟然没有了解过这个类,索性查一些资料总结一下。总结的不一定到位,就当自己学习过的证据吧!!! 提示:以下是本篇文章正文内容,下面案例可供参考 一、TypeReference是什么? TypeReference是com...

北京叮咚的博客 4万+

reference type java_java为什么使用TypeReference

用途在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如:voidtestTypeReference() {List list = new ArrayList<>();list.add(1);list.add(9);list.add(4);list.add(8);JSONObject jsonObj= newJSONObject();json...

weixin_29858113的博客 427

Java 跨平台序列化 C语言 结构体 Struct 最佳实践

nettyx是基于netty 4.1.101.Final版本二次封装的框架,扩展了一些工具, 其中最重要的功能便是Java跨平台序列化, 接下来将展示如何接收并解析成C的结构体.想要定义struct, 必须先从基础类型开始:那就先定义C中的char和long这两个类型// Basic为nettyx中提供用于定义C基础类型的抽象模板类, 所有基础类型必须实现此类 import org . fz . nettyx . serializer . typed . Basic;/**

fbbwht的博客 1481

获取泛型,泛型擦除,TypeReference 原理分析

类的字节码 Attributes -> Signature 属性中,记录了类签名,类签名会显式指定传递给父类的泛型。这是根据子类获取向父类传递的泛型理论基础,及 TypeReference 的理论基础

JellyfishMIX 的博客 1691

JavaScript确定this的指向

JavaScript确定this的指向this的指向确定1. 参考说明2. Reference介绍几个概念3. this确定的方法4 new 的说明例子:例1例2例3例4例5 this的指向确定 参考说明 Reference介绍 this确定的方法 new的说明 样例 1. 参考说明 拜读了冴羽大神的深入系列,然后加上自己谷歌的一些理解,让这部分更加容易理解 冴羽大神深入系列 new操作符理解...

qq_24724109的博客 221

从规范的角度看 this 丢失 —— 详解 Reference Type

Reference Type深入的语言特性本文所讲的是一个高阶主题,能帮你更好地理解一些边缘情况。这仅是锦上添花。许多经验丰富的的开发者不甚了了也过得不错。如果你想了解代码运行的本质,那...

LeviDing的博客 421

java为什么使用TypeReference

用途 在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如: void testTypeReference() { List&lt;Integer&gt; list = new ArrayList&lt;&gt;(); list.add(1); list.add(9); li...

weixin_34138521的博客 718

C#中的参数传递:值类型(value type)和引用类型(reference type)

摘要:由于在.NET中存在两种类型,分别是值类型(value type)和引用类型(reference type),所以很多关于C#中参数传递的混淆就因此而生。本文首先从值类型和引用类型的辨析入手,然后解释了在C#中的参数传递的四种形式:值传递(默认形式)、ref传递、out传递、params传递。 首先要弄清楚的是:值类型是分配在栈(sta

~飞 鸟 (*^__^*) 天 堂~ 1152

java中的Reference类型

本文简要总结java中的Reference类型。 最近在研读jdk并发框架,其中AQS是重点,由于我打破砂锅问到底的轻微强迫症,google了AQS作者Doug Lea的论文原文[The java.util.concurrent Synchronizer Framework],有兴趣的同学可以自行下载。其中谈到设计同步框架的核心是选择一个严格意义上的FIFO队列,作为阻塞线程队列并对其进行...

firebolt100的博客 1万+

C#中的值类型(value type)与引用类型(reference type)的区别

ylbtech- .NET-Basic:C#中的值类型与引用类型的区别   C#中的值类型(value type)与引用类型(reference type)的区别 1.A,相关概念返回顶部      C#中有两种数据类型:值类型(value type)和引用类型(reference type)。     值类型的变量直接包含它们的数据,...

weixin_34289454的博客 451
上一篇: 执行上下文与词法环境
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值