首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MDN文档关闭示例的适当性

MDN文档关闭示例的适当性
EN

Stack Overflow用户
提问于 2014-05-16 15:36:46
回答 1查看 75关注 0票数 3

闭包的MDN主题,上,他们将此示例表示为“真实世界”应用程序。

代码语言:javascript
复制
    body {
      font-family: Helvetica, Arial, sans-serif;
      font-size: 12px;
    }

    h1 {
      font-size: 1.5em;
    }
    h2 {
      font-size: 1.2em;
    }

    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;

<a href="#" id="size-12">12</a>
<a href="#" id="size-14">14</a>
<a href="#" id="size-16">16</a>

我的问题是:完全消除闭包并直接分配大小,就像在document.getElementById('size-12').onclick =12中那样,不是更简单吗?(因此,这是一个糟糕的例子?)这里的做法看上去很老套--戈德伯格。

进一步扩展,我觉得一个更突出的例子是保持闭包,但是让document元素直接从元素的id检索文本大小,所以我们只需要一个语句,而不是三个语句(每个文本大小一个)。我不知道它是如何实现的,但也许类似于

Document.getElementById(这里有一些函数用于侦听单击和注册元素的id,单击).onclick=makeSizer(一些正则表达式用于解析文本大小的id )

这有可能吗?如果是,这是否被认为是最佳做法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-16 15:51:14

我的问题是:完全消除闭包并像在document.getElementById('size-12').onclick = 12;中那样直接分配大小不是更简单吗?

不完全是。你得重复一遍:

代码语言:javascript
复制
document.getElementById('size-12').onclick = function () {
    document.body.style.fontSize = '12px';
};
document.getElementById('size-14').onclick = function () {
    document.body.style.fontSize = '14px';
};
document.getElementById('size-16').onclick = function () {
    document.body.style.fontSize = '16px';
};

所以首先让我们建立一个独立于争论的函数.

代码语言:javascript
复制
var resize = function (size) {
    document.body.style.fontSize = size + 'px';
};

但仅凭这一点,你就不会有多大的进步:

代码语言:javascript
复制
document.getElementById('size-12').onclick = function () {
    resize(12);
};
document.getElementById('size-14').onclick = function () {
    resize(14);
};
document.getElementById('size-16').onclick = function () {
    resize(16);
};

闭包允许您保留单个实现,同时保留单个函数调用的上下文(在本例中是“事件处理程序的调用”):

代码语言:javascript
复制
function makeSizer(size) {
    return function () {
        document.body.style.fontSize = size + 'px';
    };
}

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

该示例的要点是,在使用闭包时,可以使用参数分配一个完整的函数。

..。让document元素直接从元素的id检索文本大小,.

当然,这是可能的,但是这样您就不再需要闭包了,因为函数可以自己找出上下文:

代码语言:javascript
复制
var resize = function () {
    var size = this.id.split('-').pop();
    document.body.style.fontSize = size + 'px';
};

document.getElementById('size-12').onclick = resize;
document.getElementById('size-14').onclick = resize;
document.getElementById('size-16').onclick = resize;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23699315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档