当前位置: 首页 > 知识库问答 >
问题:

匿名自调用函数作为参数自动传递到上面声明的本地函数。为什么啊?[重复]

申屠宗清
2023-03-14

我只是偶然发现了这个奇怪的东西,我想知道这是一个bug,还是一个预期的行为。

let myfunc = function(a) {
     return function localScope(b) {
         console.log(a + b + " this")
     }
 }

(function () {
     console.log('test')
  })() 

第一个函数返回一个函数。我从来没有援引过他们中的任何一个。

然后在下面,我创建了一个自调用函数,所发生的是,自调用函数没有被调用,相反,它作为a参数传递给上面的myFunc父函数,然后以某种方式传递myFunc被调用,并且由于某种原因,返回的localScope函数也被调用,并且它安慰自调用函数的主体。

但是,如果我用括号将自调用函数以不同方式声明,则不会发生这种情况,如下所示:

 (function () {
     log('test')
  }()) 

这是一个bug,还是一个预期的行为?为什么以不同的方式声明自调用函数会有所不同?

我猜这与scope对象有关,但我不知道这里发生了什么。为什么会将自调用函数作为参数传递,为什么以及如何调用父函数中的本地函数。

共有1个答案

颛孙哲
2023-03-14

删除一些换行符,您可以看到原因:

let myfunc = function(a) {
     return function localScope(b) {
         console.log(a + b + " this")
     }
 }(function () {
     console.log('test')
  })() 

function(){}()实际上是调用匿名函数的有效语法。可以使用防御性分号正确拆分语句:

let myfunc = function(a) {
     return function localScope(b) {
         console.log(a + b + " this")
     }
 };

(function () {
     console.log('test')
  })() 
 类似资料:
  • 问题内容: 目前,我正在研究Sams出版的《 24小时自学Android应用程序开发》一书。我是Java,Android或其他方面的新手。我在ActionScript 3中具有非常扎实的背景,该语言与Java具有足够的相似性,因此该语言本身并不难掌握,但对于本书中某些代码示例的基本原理,我仍然存在一些疑问。例如,以下是第9小时的示例代码随附的函数: 在此函数签名中,作者已将scoreTable参数

  • 本文向大家介绍什么是JavaScript中的自调用匿名函数?,包括了什么是JavaScript中的自调用匿名函数?的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,用括号括起来的函数称为“立即调用函数表达式”或“自执行函数”。 包装的目的是为了命名空间并控制成员函数的可见性。它将代码包装在函数范围内,并减少了与其他库的冲突。这就是我们所说的立即调用函数表达式(IIFE)或自执行匿

  • 问题内容: 我正在看ribs.js截屏视频中出色的peepcode演示代码。在其中,主干代码全部封装在传递给jQuery对象的匿名函数中: 在我自己的主干代码中,我将所有代码包装在jQuery DOM’ready’事件中: 第一种方法的目的/优势是什么?这样做会创建一个匿名函数,然后立即将jQuery对象作为函数参数传递来执行该匿名函数,从而有效地确保$是jQuery对象。这是唯一的观点-保证jQ

  • 问题内容: 当我定义一个自定义类型时,基础类型的类型似乎对我是否可以按原样将其传递给函数还是需要对其进行转换有所不同。 问题是: 为什么和起作用,但不起作用? https://play.golang.org/p/buKNkrg5y- 在这里,当我运行此函数时,它会抱怨,尽管它是基础类型。但是当我打电话或他们成功运行时。 问题答案: 和 您的新类型是2种不同的不同类型。在预期的地方,您必须传递typ

  • php版本: 5.4 我定义了一个这样的函数 输出是 如何在的正文中引用。

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子: