javascript - 函数语句两边不带括号的 IIFE

标签 javascript

在下面的示例中,关于闭包,我看到了这一点:

function addButtons(numButtons) {
  for (var i = 0; i < numButtons; i++) {
    var button = document.createElement('input');
    button.type = 'button';
    button.value = 'Button ' + (i + 1);
    button.onclick = function(buttonIndex) {
      return function() {
        alert('Button ' + (buttonIndex + 1) + ' clicked');
      };
    }(i);
    document.body.appendChild(button);
    document.body.appendChild(document.createElement('br'));
  }
}

window.onload = function() { addButtons(5); };

为什么onclick方法没有定义如下?:

button.onclick = (function(buttonIndex) {
  return function() {
    alert('Button ' + (buttonIndex + 1) + ' clicked');
  };
})(i);

IIFE 不需要以下语法吗:(函数语句)(参数)

最佳答案

原始代码之所以有效,是因为 IIFE 出现在赋值中,因此赋值的右侧部分确实是一个表达式,这一点毫无疑问。

如果没有赋值,解析器会误解它是函数声明,因此会抛出语法错误,表明声明的函数缺少名称。在这种情况下,必须使用括号才能使其成为 IIFE。

但通常的做法是始终在 IIFE 中包含括号,即使在赋值中使用也是如此。

在您手头的具体情况中,您还可以使用 bind 来指定点击处理程序,它会返回它需要的函数:

button.onclick = function(buttonIndex) {
    alert('Button ' + (buttonIndex + 1) + ' clicked');
}.bind(null, i);

关于javascript - 函数语句两边不带括号的 IIFE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40359269/

相关文章:

javascript - 在主页中打印

javascript - 更好地使用异步IO

javascript - 如何使用 Google App 脚本根据条件发送带有 PDF 文件附件的电子邮件

javascript - 指令之间通信的最佳方式

javascript - 变量的范围和更改 Node 中的全局变量

javascript - 如何在单击按钮时显示 div?

javascript - 在 jquery append 语句中添加一个按钮变量

javascript - 我已经在 python 中创建了一个列表,但是如何在 javascript 中迭代这个列表?

javascript - 通过 jQuery 或 javascript 重新启动 css 转换

javascript - 从javascript中的字符串中删除一些特殊字符