“receiver”和“target”在 ES2015 规范(参见下面的示例)和 Web 的其他地方都使用,指代用作 this 值的对象。
这些词是同义词还是它们具有微妙的不同含义?
是否有一个正确的术语来指代函数在调用时的 this 值?
我注意到 26.1.6 中 Reflect.get 的签名使用这两个术语表示含义不同。
这个问题源于 ES2015 规范中的命名不一致。
规范用法示例:
表 5,第 7 行([[Get]]),部分 6.1.7.2 (我的底气):
Return the value of the property whose key is propertyKey from this object. If any ECMAScript code must be executed to retrieve the property value, Receiver is used as the this value when evaluating the code.
第 2 段,第 6.1.7.2 (我的底气):
Internal method names are polymorphic. This means that different object values may perform different algorithms when a common internal method name is invoked upon them. That actual object upon which an internal method is invoked is the “target” of the invocation. If, at runtime, the implementation of an algorithm attempts to use an internal method of an object that the object does not support, a TypeError exception is thrown.
最佳答案
回顾一下:
对对象内部方法的每次调用都有一个“目标”,即调用对象。
"Receiver"是 [[Get]] 方法的第二个nd 参数,以及[[Set]] 方法。
其他 internal object methods没有这个额外的参数。
那么,为什么[[Get]]和[[Set]]会有Receiver呢?
因为它不是目标。
Receiver用于调用[[Get]]/[[Set]]范围内的getter和setter。
ES6 9.1.8 :
A.Get( 'property', A )A.prototype.Get( 'property', A )。
Note that ES5's [[Get]] (8.12.3) do the same in a different way and without Receiver, partially because prototype climbing happens in another part (8.12.2).
Receiver 仅存在于 [[Get]] 和 [[Set]] 的上下文中,并且服务于与 target 不同的目的。
当[[Get]]需要引用它的目标时,它使用O。
O 对于 [[Get]] 的每个递归调用都是不同的,因为它爬上了原型(prototype)链。
Receiver 与 [[Get]] 一样爬上原型(prototype)链。 它的值作为参数传递给getter,接下来发生的事情不再与Receiver在同一个范围内。
O and Receiver may refer to the same object, but that doesn't matter in the context of [[Get]] or [[Set]]. In fact, Reflect.get allows the caller to set a different target and Receiver and make them different from the get go.
对于其他的对象内部方法,大部分根本不爬原型(prototype)链。执行此操作的两个([[HasProperty]] 和 [[Enumerate]])不需要保留初始目标(可以这么说)。
解决了这个问题,你then ask规范是否为“Receiver”赋予了在一般 JavaScript 讨论中使用的含义,例如它如何在 6.1.7.2 中定义“target”。 这个答案是否定的。
“Receiver”的范围非常狭窄,仅用作参数名称,但“target”在那里以一般的、不太正式的方式使用。
“目标”是从一般性讨论中借用的术语 -
ES5 没有定义调用目标的概念。
ES5“目标”可以是参数、变量、语句、表达式或被调用的函数。但不是 this 的隐式替换。
编写该规范是为了以非常非常精确的术语传达“JavaScript 行为”,使其非常技术化,包括参数的使用。 它只是提供与一般编程讨论不同的交流方式。
3.a.许多 JS 开发人员根本不阅读规范。 对于日常编码来说是不必要的。
3.b.我们谈论“闭包”、“范围链”、“事件队列”和“粗箭头”或“lambda”,不是吗? 规范没有定义这些术语。
3.c.
规范可能会以不同的方式命名事物,如在执行上下文或作业队列中。
它可能根本不命名事物。关闭是一种紧急行为。
当它命名时,它不会创建别名。箭头函数从不称为 lambda。
规范不规范一般性讨论。
使用常识进行共同讨论。
关于javascript - "target"和 "receiver"是 ES2015 规范中的同义词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37644517/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11
我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d