javascript - javascript 中的闭包理解

标签 javascript

this is link from js fiddle

那里有一些像这样的js代码:

function makeSizer(size) {
  return function() {
    document.body.style.fontSize = size + 'px';
  };
}

var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);

document.getElementById('size-12').onclick = size12;
document.getElementById('size-14').onclick = size14;
document.getElementById('size-16').onclick = size16;  document.getElementById('size-16').onclick = size16;

我有两个问题,第一个问题: 使用这个额外变量有什么好处

var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);

当你可以写

document.getElementById('size-12').onclick = makeSizer(12)

第二个是: 为什么我们这样编写函数:

function makeSizer(size) {  document.body.style.fontSize = size + 'px';  }

一切都停止工作了。我知道这是重复的,并且有一些关于关闭的帖子,但它们没有帮助

最佳答案

第一个问题:

在此示例中,它不会给您带来任何好处,但如果您想将这些函数用作其他 onclick 处理程序,这将节省一些资源,并且代码将更易于维护。

第二个问题:

这是因为第一个 makeSize 函数返回函数,然后该函数绑定(bind)到单击处理程序 - 每次单击时都会调用此返回的函数。 您更改的函数不会返回任何内容(更具体地说,未定义),因此 nothink 绑定(bind)到 onclick 事件。

关于javascript - javascript 中的闭包理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19316950/

相关文章:

javascript - 使用纯 javascript 将类添加到 html 元素时监听事件

javascript - 我可以使用 javascripts window.print 将 zpl 打印到通过 USB 连接的 Zebra 打印机吗?

javascript - jsPlumb 在 angular.js 中的 View 更改后不会重绘?

javascript - 如何使用 jQuery 检测元素顶部是否靠近浏览器底部?

javascript - 通过 Ajax 请求发送后无法解析 JSON

javascript - 随机数,不等于前一个数

javascript - 自定义元素类型在脚本类型=模块中加载时报告 HTMLElement?

javascript - Google +1 按钮和推文按钮的问题

javascript - 使用 javascript 设置文档类型

javascript - 将 "extra"参数传递给存储在变量中的函数 - Javascript