gpt4 book ai didi

使用函数声明的 JavaScript 闭包

转载 作者:行者123 更新时间:2023-12-03 02:36:18 26 4
gpt4 key购买 nike

我看到使用函数表达式而不是函数声明来声明闭包。作为java脚本的新手,我有以下疑问。我尝试提及类似的问题,但它对我没有帮助。

  1. 闭包是否总是需要使用函数表达式来声明而不是函数定义
  2. 闭包是否需要自调用函数表达式
  3. 我了解 Function 之间的主要区别声明和函数表达式 id 提升。谁能帮我在什么情况下我应该决定是否应该去函数声明或函数表达式。使用其中任何一种的其他优点和缺点是什么

抱歉,有些问题可能之前已经回答过,或者有些基本,但作为新手,我觉得很困惑

下面是我使用函数声明完成的示例,但它没有给我正确的结果

function counter() {
var count = 0;
return function() { return count++; }
}
<!-- using function declaration -->

<button onclick="alert(counter())">Counter</button>

var counter = (function() {
var count = 0;
return function() { return count++; }
increment();
})();
<button onclick="alert(counter())">Counter</button>

最佳答案

Do closure always need to be declared using function expression and not function definition declaration

没有。当任何函数定义在外部作用域变量上关闭时,它都会形成一个闭包。

只是,通常在使用闭包时,我们希望对函数对象执行单一操作,因此我们只需将其作为表达式放在调用或赋值或返回语句中,而不是预先声明它并引用它的名字。

Do closure need to be self invoked in function expression

没有。大多数 IIFE 根本不是闭包。然而,它们确实经常提供闭包定义的范围。不过,可以在任何类型的作用域中创建闭包,甚至在 block 作用域中(使用 let/const)。

I understand key difference between function declaration and function expression is hoisting. What are the other advantages and disadvantages of using any one of them?

看看var functionName = function() {} vs function functionName() {} .

Can anyone help me when and which in situation i should decide whether i should go with function declaration or function expression.

每当您使用函数表达式初始化变量声明时,只需使用函数声明即可。否则,您将主要使用函数表达式。

<小时/>

你的例子与这个问题没有任何关系。没有区别

function makeCounter() {
var count = 0;
return function increment() { return count++; }
}

function makeCounter() {
var count = 0;
function increment() { return count++; }
return increment;
}

只不过第一行较短。当然你必须这样做

var counter = makeCounter(); // assigns increment function to counter
counter(); // calls increment

计算任何东西。在您的 IIFE 版本中,您只需将 makeCounter 内联为函数表达式:

var counter = (function makeCounter() {
var count = 0;
return function increment() { return count++; }
// increment(); - this statement is never evaluated
})();
counter();

关于使用函数声明的 JavaScript 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48524593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com