【问题标题】:Scope of a named IIFE name [duplicate]命名 IIFE 名称的范围 [重复]
【发布时间】:2016-12-15 12:29:22
【问题描述】:

我以为我了解立即调用函数表达式 (IIFE) 的本质,但现在我意识到我不了解。

我在一段代码中创建了一个 IIFE(在使用 JQuery 的网页中)。但是,如果我命名该函数,并尝试从封闭范围调用该函数,我会收到“未定义”错误?

实时代码在 IE11 和 Firefox 38 中的行为不同,这让事情变得更加混乱。但是我在这里创建了一个简单的测试 JSfiddle-

https://jsfiddle.net/ktqq4uat/

这在浏览器之间是一致的。

我以为这两行-

  (function myFunction2() {
   ...

  (myFunction3= function() {
   ...

几乎是等价的,但我只在“myFunction2”上得到一个未定义的错误。

我会很感激一些帮助理解-

1) 为什么 (function myFunction2() {... 隐藏了函数的名称及其内部范围。该名称的范围是什么?

2) 为什么上面的 myFunction2 和 myFunction3 行为不同。

Rgds

【问题讨论】:

  • IIFE 是一个括在括号中的函数,在它们之外不可用。虽然你可以在里面调用它们。
  • 你不能做testObject.newFunction2 = myFunction2;,它在外面是不可见的
  • 什么,IE11 还没有修复这个 IE6 的 bug?

标签: javascript scope iife


【解决方案1】:

命名函数表达式只创建一个变量:

  • 与函数同名
  • 有一个值是对该函数的引用

在他们自己的范围内。它们还评估为对该函数的引用,因此您可以将该引用传递到某处(例如,将其分配给 myFunction3)。

函数声明在其父作用域中创建一个类似的变量。它们不求值(因为它们不是表达式)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多