Javascript 闭包/变量作用域问题 - 我知道它有效,但为什么?

2024-01-29

我用 JS 开发已经有一段时间了,虽然我知道下面的代码可以工作,但我不太明白why有用。

在我看来,我在 testClosure 函数中定义了 testString,并且我期望该变量在 testClosure 函数完成时“消失”,因为它是局部变量。

但是,当我使用计时器调用内部函数时,它仍然知道 testString 变量。为什么?当 testClosure 执行完毕时,这个变量不是在五秒前就消失了吗?内部函数是否获取对 testClosure 中所有变量的引用,并且它们在所有内部函数完成之前保持有效?

function testClosure() {
  var testString = 'hai';

  // after 5 seconds, call function below
  window.setTimeout(function() {

    // check if function knows about testString       
    alert(testString);

  }, 5000);         
}

testClosure();

The function特殊形式创建词汇范围。在该范围内创建的任何对象都将在其创建时在范围内按词法查看环境(名称到值的绑定)。

事实上,创建一个函数就是only在 JavaScript 中创建词法作用域的方法,这就是为什么你总是看到这样的扭曲:

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

Javascript 闭包/变量作用域问题 - 我知道它有效,但为什么? 的相关文章

随机推荐

  • Ansible 随机 UUID 生成

    在我的 Ansible 脚本中 我想动态生成 UUID 并稍后使用它们 这是我的方法 shell echo uuidgen with sequence count 5 register uuid list uri url http www
  • PHP sprintf 转义%

    我想要以下输出 即将从您的充值账户中扣除 27 59 欧元的 50 当我做这样的事情时 variablesArray 0 variablesArray 1 27 59 stringWithVariables About to deduct
  • 如何在 QEMU 中模拟 TrustZone?

    我正在尝试在 Qemu 中模拟 TrustZone 功能 我发现两个链接似乎解释了这个过程 第一个参考 http www linaro org blog core dump arm trustzone qemu 未附加支持 TrustZon
  • 关于函数调用堆栈的困惑

    根据维基百科 调用者将返回地址压入堆栈 而被调用者 子例程完成后 从调用中弹出返回地址 堆栈并将控制权转移到该地址 图片来自维基 我不太明白这一点 假设我有一个 C 程序如下 include
  • 将十六进制值的行垂直按列转换为二进制

    我正在处理来自串行设备的数据 该设备以非常有趣的格式输出数据 该设备有一个 256x256 的像素阵列 而每个像素都有一个14 bit值 用移位寄存器读出 为了显示格式 我将对其进行说明 就像每个像素都有一个6 bit value Pixe
  • VBA - 导入带有特殊字符的bas模块

    我已经为 excel 模块 bas frx 和 frm 文件 实现了自动导入 版本控制 因此客户将始终获得最新版本的 VBA 脚本 解决方案是这样的 vba 脚本 在 Workbook Open 上 检查 github 存储库版本号是否相等
  • 如何一起使用 requireJS 和 jQuery?

    我想使用 requireJS 并且我正在使用 jQuery 我不想使用 requireJS 和 jQuery 的组合版本 因为我没有使用最新的 jQuery 版本 使用 requireJS 的最佳方式是什么 这也是我的确切问题 我还必须使用
  • 如何确定 Wix 中是否存在注册表项

    我想确定 Wix 中是否存在注册表项 我无法对该键中的值名称做出任何假设 但至少存在一个 未设置默认值 是否可以在不使用自定义操作的情况下检查密钥是否存在 以及可选地 是否有任何值 看看注册表搜索 使用样本
  • 在 VB.NET 中创建一个新线程

    我正在尝试使用匿名函数创建一个新线程 但我不断收到错误 这是我的代码 New Thread Function Do something here End Function Start 以下是我得到的错误 New 语法错误 结束功能 结束函数
  • iPhone SDK:如何检查用户输入的IP是否有效?

    我的 iPhone 应用程序包含多个对服务器的 http 请求 服务器的IP地址可以由用户输入 这样您就可以将应用程序与您自己的私人服务器结合使用 在发出请求之前 我总是检查输入的 IP 地址是否有效 我这样做 BOOL urlExists
  • Mandrill 发送电子邮件时出现问题:消息未发送:已排队

    我在使用 Mandrill 发送电子邮件时遇到问题 我创建了一个帐户和一个新模板 但是当我尝试发送该模板的测试时 即使我曾经发送过电子邮件 我也会收到以下消息 消息未发送 已排队 我为具有相同 pb 的人修复了此问题 我向 Mandrill
  • 无法停止为静态内容触发 ASP.NET 模块

    我在 ASP NET MVC 应用程序中有一个模块 该模块工作正常 但它会针对包括静态内容在内的每种类型的文件触发 即使我有
  • JavaScript 中的函数顺序

    我的问题是基于一本书中的例子 面向对象的 JavaScript https rads stackoverflow com amzn click com 1847194141 第 81 页 词汇范围 所以 我从这个例子中了解到 functio
  • Android Studio 4.1 中缺少 Logcat

    我最近在我的 Windows 机器上安装了 AS 我尝试在 Logcat 中查看我的日志 但无法找到 激活 Logcat 我尝试按照说明进行操作here https stackoverflow com questions 16817566
  • WPF DataGrid - 插入数据网格时突出显示新行

    我有一个绑定到 ObservableCollection 的数据网格 我想做的是在将新行添加到数据网格时 即 当将新对象插入到 ObservableCollection 中时 突出显示新行 我想在插入行时突出显示行 方法是最初更改背景颜色
  • 有没有办法使导航栏徽标响应?

    这是我使用 bootstrap 4 构建的网站 我对徽标有一个大问题 因为它在所有设备上保持相同的大小 我尝试过添加 img fluid 但是如果添加这个类 徽标在手机上会缩小很多 看起来就像一个小点 所以我删除了这个类 现在 在移动设备上
  • 通用 Promise 重试逻辑

    我试图弄清楚如何创建一个通用重试函数 该函数对于传递给它的任何承诺都会呈指数级回退 看起来除了几件事之外一切都正常 如果该函数在第一次尝试时解析 那么我会看到我的解析值 并且它会输出嘿 这是预期的 如果它在任何后续调用中解决 它不会注销嘿
  • 使用 yajl-objc 编码自定义类

    Summary 基于一些基准 http samsoff es posts updated iphone json benchmarks 我选择了yajl objc http github com gabriel yajl objc用于我的
  • android.view.WindowManager$BadTokenException 异常。有什么指针吗?

    我有两个 webview 为了从两个 webview 中删除通用功能 我创建了一个超类 其中包含超类中的所有方法 并在两个 webview 中使用它 有一次 当我创建对象并设置第一个 Web 视图中的变量时 Web 视图正确显示 当我按 返
  • Javascript 闭包/变量作用域问题 - 我知道它有效,但为什么?

    我用 JS 开发已经有一段时间了 虽然我知道下面的代码可以工作 但我不太明白why有用 在我看来 我在 testClosure 函数中定义了 testString 并且我期望该变量在 testClosure 函数完成时 消失 因为它是局部变