Javascript Closure: Pratical Closures example in MDN
Javascript Closure: Pratical Closures example in MDN
因为我不完全理解JavaScript中闭包的功能。我对MDN中实用闭包的例子有些怀疑。
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures(
我尝试修改 MDN 给出的代码,但它不起作用。我不知道为什么。
此示例中的代码可以做的是,通过单击 12、14 或 16,单词的字体大小可以相应地更改。
以下是原始源代码和链接:http://jsfiddle.net/vnkuZ/
.HTML:
<p>Some paragraph text</p>
<h1>some heading 1 text</h1>
<h2>some heading 2 text</h2>
<a href="#" id="size-12">12</a>
<a href="#" id="size-14">14</a>
<a href="#" id="size-16">16</a>
.CSS:
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
}
h1 {
font-size: 1.5em;
}
h2 {
font-size: 1.2em;
}
JavaScript:
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;
我只是修改了JavaScript部分:
function makeSizer(size) {
document.body.style.fontSize = size + 'px';
}
<!-- var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16); -->
document.getElementById('size-12').onclick = makeSizer(12);
document.getElementById('size-14').onclick = makeSizer(14);
document.getElementById('size-16').onclick = makeSizer(16);
它不行...
你省略了makeSizer()
的重要部分,即return function() {...}
。 您必须拥有该部分,并且只能在该内部函数中进行修改。
如果要按原样分配,则必须是这样的:
function makeSizer(size) {
return function() {
document.body.style.fontSize = size + 'px';
}
}
从makeSizer()
返回的内部函数对于它的使用方式至关重要,并且是创建闭包的原因,该闭包保留size
的值,以便在以后click
事件触发时使用,并且是将函数分配给onclick
处理程序而不是立即执行函数的原因。 这两个非常重要的区别都是MDN页面的全部意义所在。
以下是分步说明:
onclick
属性需要分配一个函数。 您的 makeSizer()
版本不返回任何内容(这意味着它返回 undefined
(,所以当你在做的时候:
function makeSizer(size) {
document.body.style.fontSize = size + 'px';
}
document.getElementById('size-12').onclick = makeSizer(12);
它将立即执行makeSizer(12)
并分配执行该函数的返回结果,该函数将undefined
.onclick
属性,因此单击它没有任何作用,因为没有分配给onclick
属性的函数。
通过makeSizer()
实现,您可以改为执行以下操作:
function makeSizer(size) {
document.body.style.fontSize = size + 'px';
}
document.getElementById('size-12').onclick = function() {
makeSizer(12);
};
那本来会奏效的。 在这里,您可以清楚地看到您将为 onclick 属性分配一个函数,因此当单击发生时,有一个函数可以调用单击事件。
- Node.js's Buffer.writeFloatBE in Javascript
- Setting default onclick behavior for <img> tag in gene
- Lucene Search in Alfresco
- grep in JQuery to C#
- write HTML in JavaScript
- jQuery setTimeOut: in for-loop
- SetTimeout and clearTimeout in Javascript
- lightbox in html 5 and javascript
- HTMLInputElement in IE7
- Mongodb$in以与数组中相同的顺序获取结果
- element.dataset in Internet Explorer
- jQuery parent() in table
- Instagram oauth flow in angularjs
- In循环的In运算符前后
- 如何使用for in循环在javascript中显示对象中的对象
- Jquery change onchange in onload
- 重构 jQuery in JS 问题
- strongloop script.js run find in before delete方法:如何同步运行异步方法
- TicTacToe minimax AI in Javascript
- Javascript Closure: Pratical Closures example in MDN