`this` 在默认参数下如何工作?

2023-11-24

所以...ES6(恰好在几个小时前标准化)带来了默认参数对于类似于 PHP、Python 等中的函数,我可以执行以下操作:

function foo (bar = 'dum') {
    return bar;
}

foo(1); // 1
foo(); // 'dum'
foo(undefined); // 'dum'

MDN 表示参数的默认值是在调用时评估的。这意味着每次我调用该函数时,表达式'dum'再次评估(除非实现做了一些我们不关心的奇怪的优化)。

我的问题是,如何this玩这个?

let x = {
  foo (bar = this.foo) {
    return bar;
  }
}

let y = {
  z: x.foo
}

x.foo() === y.z(); // what?

babel 转译器目前将其评估为false,但我不明白。如果它们真的在调用时进行评估,那又怎么样:

let x = 'x from global';

function bar (thing = x) {
  return thing;
}

function foo () {
  let x = 'x from foo';
  return bar();
}

bar() === foo(); // what?

babel 转译器目前将其评估为true,但我不明白。为什么bar不采取x from foo当被叫到里面时foo?

1 - Yes I know it is ES2015.
2 - Example A
3 - Example B


我的问题是,如何this玩这个?我不明白。他们真的在通话时进行评估吗?

是的,参数初始值设定项在调用时进行评估。情况很复杂,但步骤基本如下:

  1. A 新的执行上下文建立在堆栈上,
    with a 新环境在被调用函数的“闭包作用域”中
  2. 如果有必要的话是thisBinding已初始化
  3. Declarations are instantiated:
    1. 创建参数名称的可变绑定
    2. 如果有必要的话,一个arguments对象被创建为一个绑定
    3. The 绑定被迭代初始化来自参数列表(包括所有解构等)
      在此过程中,评估初始化器
    4. 如果涉及任何关闭,则会插入一个新环境
    5. 创建函数体中声明的变量的可变绑定(如果尚未通过参数名称完成)并初始化为undefined
    6. 绑定let and const函数体内的变量被创建
    7. 函数的绑定(来自主体中的函数声明)使用实例化函数进行初始化
  4. 最后函数体被求值.

所以参数初始化器确实可以访问thisarguments调用的,先前初始化的其他参数,以及其“上层”词法范围内的所有内容。它们不受函数体中声明的变量的影响(尽管它们受到所有其他参数的影响,即使处于临时死区)。

那这个呢:

function bar (thing = x) {}
{
  let x = 'x from foo';
  return bar();
}

我不明白。为什么bar不采取x from foo当被叫时 里面foo?

Because x是一个局部变量bar无权访问。我们很幸运有他们不是动态范围的!参数初始值设定项不是在调用站点计算的,而是在被调用函数的作用域内计算的。在这种情况下,x标识符被解析为全局x多变的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`this` 在默认参数下如何工作? 的相关文章

  • Javascript拆分正则表达式问题

    你好 我正在尝试我认为在 Javascript 中相当简单的正则表达式 但给我带来了很多麻烦 我希望能够通过 javascript 通过 和 分割日期 var date 02 25 2010 var myregexp2 new RegExp
  • 禁用小写字符下划线:g q p j y?

    有时您不希望下划线盲目地穿过带下划线的页面标题 有没有办法自动优雅地禁用强调对于某些小写字符 在这些情况下 最好不要在这些小写字母下划线 例如 g q p j y CSS h1 text decoration underline PAGE
  • Firebase HTTP Cloud Functions - 读取数据库一次

    我有 Firebase HTTPs 功能 该函数需要根据查询参数从 Firebase 数据库读取值 并根据该数据返回结果 Firebase JS SDK 表示要使用以下命令来执行此操作 return firebase database re
  • 如何阻止地址自动填充谷歌地点

    所以我在我的表单上有一个谷歌地图自动完成功能 当它到达一个位置时 它会占据该位置并格式化它 以便所有正确的信息都进入表单上的不同输入 我遇到的问题是在 place changed 事件触发自动完成填充输入之前 我想阻止最初的人口 而是填充我
  • 在 Nodejs/javascript 中的 Excel 中创建动态数量的列或标题

    我用过exceljsNodejs中用于将json数据导出到excel的模块 它工作正常 但必须在添加行之前预定义标题 列的名称 即列是固定的 添加行后 我无法动态添加列 我尝试了许多通过 npm 提供的模块 但它们都具有相同的功能 那么 有
  • 为什么这个 JavaScript 可以在 Safari 上运行,但不能在 Firefox 上运行?

    我有 HTML 文件 我在 Safari 上尝试了该代码 运行良好 但是当我在 Firefox 上尝试这个时 它不起作用 任何人都可以建议如何使其在 Firefox 上工作吗 单击撤消按钮时 我想从 jsp 文件中检索内容 当我在 mac
  • 从 iframe 关闭父弹出窗口

    在domain1 com 上 我有一个链接 可以打开domain2 com 的弹出窗口 弹出窗口中有一个 iframe 也托管在 domain2 com 上 在 iframe 中 我试图关闭弹出窗口 我似乎对如何做到这一点感到困惑 在 if
  • 外部 CSS 是否应用于 jsPDF 生成的 pdf

    我已经开始使用 jspdf 制作一些演示 我有一个 html 文件 我的 css 在外部文件中 我写了下面的代码来生成我的pdf pdfButton on click function var pdf new jsPDF p in lett
  • 如何在 Jquery Chosen 插件中搜索乌尔都语?还有其他方法在 Selectbox 中搜索乌尔都语吗?

    基本上我想在选择框中有搜索选项 并在选择框中选择实现的 jquery 所有选项均采用乌尔都语语言 如何扩展所选搜索以匹配乌尔都语 或者还有另一种方法在选择框中搜索乌尔都语 任何其他建议 提前致谢 有一种非常简单的方法可以将所有正则表达式逻辑
  • 用于匹配重复子字符串的单个js正则表达式?

    假设我有一个字符串 例如 where is mummy where is daddy 我想用空字符串替换任何一组重复子字符串 所以在这种情况下where and is元素将被删除 结果字符串将是 mummy daddy 我想知道是否有任何单
  • 为什么 html 中的 AngularJS 错误没有显示在控制台中?

    Here s a fiddle http jsfiddle net 6y7odxmj 3 用于说明 当 ng click 指令 例如 调用未在控制器的 scope 或其父级 上定义的函数时 它会默默地失败 当我尝试调试网页时 这种行为令人抓
  • 从变量值动态设置 ng-controller

    我正在使用 AngularJs 和 NodeJS 开发一个应用程序 我对将控制器的名称设置为主控制器中的变量的值感到震惊 为了更好地解释它 我的 index html 看起来像这样 tbody tr td td td member task
  • JavaScript 检查时区名称是否有效

    有没有一种方法可以在不使用外部库的情况下检查 JavaScript 中的时区名称是否有效 当用户在文本字段中输入时区名称时 我想验证时区是否有效 我知道我们可以使用时刻时区库轻松做到这一点 但我不想使用任何额外的库 我正在寻找纯 JavaS
  • 包含括号的变量会导致问题[重复]

    这个问题在这里已经有答案了 简单的事情 当单击按钮并将其写入文本字段时 我读取选择框的值 选择框
  • 扩展html表格突出显示行和列并使当前单元格具有不同的颜色

    我找到了用鼠标悬停时突出显示行和列的示例 https stackoverflow com a 28312853 139698 https stackoverflow com a 28312853 139698 如何使鼠标悬停的一个单元格变为
  • 在Vue.js 3中添加全局变量

    如何在 Vue js 3 中添加全局变量 在 Vue js 2 中 我们在main js file Vue prototype myGlobalVariable globalVariable 最直接的替换就是app config globa
  • 谷歌绘制具有相同比例的多个系列的图表

    我正在寻找一种在图形上显示多个系列的方法 这些系列具有相同的比例但仅显示一次 正如你在这里看到的 http jsfiddle net Youkoal d3xwnqdu http jsfiddle net Youkoal d3xwnqdu 我
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet
  • Chrome + 另一个进程:进程间通信比 HTTP/XHR 请求更快?

    我有一个进程 1 对视频流进行实时图像处理 我需要在 Chrome 中的 HTML 页面中渲染该视频 同一台计算机上的进程 2 在canvas or img or videoHTML5 元素 由于我有 1000x1000 像素 x 3 字节
  • 通过均匀分布值来有效合并两个数组

    我见过许多问题 答案主题是通过交替值合并两个数组 他们是这样工作的 let array1 a b c d let array2 1 2 let outcome a 1 b 2 c d 但我希望输出更加高效 并且根据数组大小均匀分配值 exp

随机推荐

  • 使用 getRotationMatrix() 和 getOrientation() 查找方向

    我试图获得相对于磁北指向相机的矢量方向 我的印象是我需要使用从 getOrientation 返回的值 但我不确定它们代表什么 当我改变手机的方向时 我从 getOrientation 获得的值不会发生可预测的变化 旋转 90 度不会改变值
  • 测试关闭的套接字

    我正在尝试测试一个已关闭的套接字 该套接字已被对等方正常关闭 而不会产生双重发送的延迟影响以引发SIGPIPE 这里的假设之一是 如果关闭的套接字在上次写入 发送后立即被对等方正常关闭 诸如过早关闭之类的实际错误将在代码中的其他位置进行处理
  • 如何在Linux中禁用oom Killer? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我当前的配置是 gt cat proc sys vm panic on oom 0 gt cat proc sys vm oom kill allocating task 0 gt
  • 跟踪 Core Animation 动画

    我有两个在屏幕上移动的圆圈 这些圆圈都是包含其他 UIView 的 UIView 每个圆圈之外的区域是透明的 我编写了一个函数来创建一个 CGPath 它将两个圆与四边形连接起来 我将这条路径填充到跨越整个屏幕的透明 CALayer 中 由
  • “在成员函数之外的封闭类的定义中需要默认成员初始值设定项” - 我的代码格式是否错误?

    struct foo struct bar bar no error w o this line bar data nullptr no error w o this line foo noexcept default no error w
  • Racket/Scheme 中的 zip 功能

    给定两个列表 返回一个列表 其元素是大小为二的列表 这样对于i th 列表 第一个元素是i 第一个原始列表的第一个元素 第二个元素是i 第二个原始列表的第一个元素 如果一个列表小于另一个列表 则生成的列表具有最小的大小 因此 如果其中一个列
  • 如何在 Protractor / AngularJS 测试中重用代码

    我们在几个 JS 文件中对 AngularJS 应用程序进行了几个 Protractor 端到端测试 它们工作得很好 但是 整个测试中有很多重复的代码 我们希望将其干燥 例如 每次登录时 我们都必须单击文本元素 输入用户名和密码 然后单击
  • 如何将 Angular2 RC1 与 systemjs 捆绑在一起

    在发布候选版本之前 Angular 提供了一个捆绑文件 自候选版本发布以来 不再有捆绑文件 包括 angular2 和 rxjs 我的应用程序现在在 7 秒内发出 671 个请求来加载 这阻碍了发展 有谁知道如何捆绑 Angular 和 r
  • JavaScript 事件处理程序参数

    我有以下 JavaScript 代码 var ans el document createElement input ans el setAttribute id unique int value ans el setAttribute t
  • 将数据从 DBGrid 导出到 Excel

    我想知道是否有人可以将数据从 DBGrid 导出到 Excel 我正在使用 Delphi 7 Excel 2007 和 ADO 任何帮助将不胜感激 如果您想要快速导出原始数据 只需使用类似以下内容导出记录集 ADO Dataset reco
  • 替换旧的 GetAppUsers 调用以查看使用我的应用程序的用户朋友?

    旧 REST API 中一个非常有用的调用是Friends getAppUsers 此调用会返回正在使用某个应用程序的所有朋友 遗憾的是 这并不在打开图API Stack Overflow 上有一篇关于它的好文章 使用 Graph API
  • 使用 ACM 的证书在 elasticbeanstalk 中强制使用 https

    我已经配置了一个可扩展的 EB Elasticbeanstalk rails puma 实例 我已通过 ACM Amazon Certificate Manager 申请了 https 并将其应用到我的负载均衡器 我的网站现已启用 HTTP
  • ASP.NET MVC 认为我的虚拟目录是一个控制器

    我在 IIS 中的 MVC 网站下有一个名为 Files 的虚拟目录 该目录与我的 Views 目录处于同一级别 当我将 MVC 应用程序中的文件链接到 Files 目录下的文件时 出现以下错误 路径控制器 文件 图像 1c7f7eb8 5
  • 快速比较字符串可选与非可选

    在 Swift 中比较字符串时 您可以将非可选字符串与可选字符串进行比较 像这样 文本是可选的 并且它是空的 UITextField text True 是因为相等运算符本身解开字符串吗 对于每一个Equatable键入 还为选项定义了操作
  • 如何让 Django 2.0 使用 Oracle 11g 语法而不是 12c?

    这是我的开发环境 Windows 7 x64 Python 3 6 3 64位 虚拟环境 姜戈2 0 CX Oracle 6 1 Oracle 11 2 企业版 64 位 在远程计算机上 我没能做到migrate 姜戈管理 py迁移 因为D
  • 向 Visual Studio 2010 Express 添加库

    似乎无法找到如何添加库的明确答案 项目属性有很多地方可以添加文件路径 但我想知道我是否不应该编辑所有这些路径 有人可以告诉我每个可能条目的用途 如果有更多条目 以及我应该编辑哪些条目 或者方便的教程 我会列出我所知道的条目 目前正在尝试添加
  • 无法解析用户名以确保我已登录网站

    我已经用 python 编写了一个脚本来登录网站并解析用户名以确保我确实能够登录 使用我在下面尝试过的方法似乎可以让我到达那里 但是 我在脚本中使用了从 chrome 开发工具中获取的硬编码 cookie 来获得成功 我尝试过 import
  • 将键盘快捷键绑定到 WPF 视图模型中的命令

    我有一个应用程序 其中我有一个UserControl里面有一个工具栏 这个工具栏有一个按钮Execute反过来 它的命令绑定到ICommand视图模型作为属性公开的派生类
  • R 系统时间的输出中时区消失

    我正在尝试将系统日期和时间输出到文本文件 当我这样做时 时区就会消失 示例如下 gt Sys time 1 2012 05 24 09 58 38 CDT gt currentTime lt Sys time gt currentTime
  • `this` 在默认参数下如何工作?

    所以 ES6 恰好在几个小时前标准化 带来了默认参数对于类似于 PHP Python 等中的函数 我可以执行以下操作 function foo bar dum return bar foo 1 1 foo dum foo undefined