【问题标题】:closures in javascript understandingjavascript理解中的闭包
【发布时间】:2013-10-11 11:24:13
【问题描述】:

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';  }

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

【问题讨论】:

标签: javascript


【解决方案1】:

第一个问题:

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

第二个问题:

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

【讨论】:

  • 当然在示例中它会带来好处——(外部)函数必须只运行一次,而不是每次调用。
  • @CBroe:那些变量sizeN 没有。
  • 编写document.getElementById('size-12').onclick = makeSizer(12); 只会运行一次makeSizer(12),而不是每次点击。每次点击都会运行返回的函数。
  • 是的,但是如果您想将相同的事件分配给多个元素,使用 .onclick = size12 只会运行一次外部函数,而 .onclick = makeSizer(12) 会在您每次分配事件处理程序时运行它方式。
  • @user2114177 因为当你写 funcName(params) - 它调用这个函数并返回一些东西。当您编写 funcName - 不带括号时,您将传递函数的引用。在你的情况下 makeSizer(12) 运行时 - 返回对函数的引用 - 然后是点击处理程序。
【解决方案2】:

onclick 属性需要一个在事件发生时执行的函数。

该函数将接收鼠标事件作为参数。但是,在您的情况下,该函数需要知道字体应设置为的大小。

这是通过动态创建函数并使用闭包来捕获大小来解决的。

【讨论】:

  • 别提evaluated字符串了……有些人会搞恶作剧。
猜你喜欢
  • 2013-03-25
  • 2016-01-30
  • 1970-01-01
  • 2012-04-23
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
相关资源
最近更新 更多