【问题标题】:Anonymous self-invoking function is automatically passed as an argument to above declared local function. Why? [duplicate]匿名自调用函数会自动作为参数传递给上述声明的本地函数。为什么? [复制]
【发布时间】:2021-07-26 21:31:38
【问题描述】:

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

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

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

第一个函数返回一个函数。我从不调用它们中的任何一个。

然后在下面,我创建了一个自调用函数,发生的情况是,自调用函数没有被调用,而是作为a 参数传递给上面的myFunc 父函数,然后不知何故myFunc 被调用,由于某种原因,返回的localScope 函数也被调用,它控制台出自调用函数的主体。

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

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

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

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

【问题讨论】:

  • 因为您缺少用于分隔两个语句的分号。
  • "如果我通过用括号括起来以不同方式声明自调用函数,则不会发生这种情况" - 它仍然会发生,它只是传递了一个不同的值。
  • @Bergi 我还是不明白为什么?它们仍然是两个独立的功能吗?为什么将自调用作为参数传递?如何? myFunc是怎么调用的,返回的localScope是怎么调用的?
  • @IloveCoffee 因为let myfunc = function(a) {…}(…) 仍然是一个函数调用。它们不是分开的,因为您在所有陈述之后都缺少分号。不要省略分号,除非你了解 JS 是如何处理它们的。

标签: javascript


【解决方案1】:

删除一些换行符,你就会明白为什么了:

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

function(){}() 实际上是调用该匿名函数的有效语法。您可以使用defensive semicolon 正确拆分语句:

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

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

【讨论】:

  • 我还是不明白为什么?它们仍然是两个独立的功能吗?为什么将自调用作为参数传递?如何? myFunc是怎么调用的,返回的localScope是怎么调用的?
  • 因为function myFunc(){} (function test(){}) () (给出了匿名函数名称来解释)function test(){} 调用你的myFunc 函数,然后调用结果(即@987654331 @) 由于最后的()。这就是为什么你的console.log 打印<code of test function>undefined thisafunction test(){}bundefined 因为 () 没有传递任何东西。
  • 我以前从未研究过这个。你能试着详细说明一下吗?是的,我知道匿名自调用函数作为参数传递,然后被安慰,这就是b 未定义的原因,但是如何.. 为什么.. 是由匿名自调用调用的myFunc()功能?效果如何?返回的localFunction() 究竟是如何调用的?谁调用它?
  • 匿名函数如何通过将自身作为参数传递来调用myFunc(),然后它又如何调用返回的函数?
  • 正如我在答案中提到的,function(){}(args} 定义了一个函数并立即调用它。它甚至还有自己的名字,即IIFE。换行符并没有真正拆分语句。例如。 "some string" \n + "some other string" 是超过两行的有效表达式。在您的情况下,您完全按照我提到的function(){}(args) 进行了操作,除了args 而不是function(){console.log('test')}。因此你正在做:myfunc = (function(a){...})( function(){...} )()。第一个调用返回localFunction,然后() 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
相关资源
最近更新 更多