`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` 在默认参数下如何工作? 的相关文章

随机推荐

  • 使用 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