Javascript 这是一个很好的闭包例子吗?

Javascript 这是一个很好的闭包例子吗?,javascript,function,functional-programming,closures,Javascript,Function,Functional Programming,Closures,我把这看作是一件好事,不明白为什么这是件好事(TM) 为什么上面的比下面的好 function makeSizer(size) { document.body.style.fontSize = size + 'px'; } var size12 = makeSizer(12); var size14 = makeSizer(14); var size16 = makeSizer(16); 它有什么不同之处?显然,我没有抓住重

我把这看作是一件好事,不明白为什么这是件好事(TM)

为什么上面的比下面的好

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=size12;
document.getElementById('size-14')。onclick=size14;
document.getElementById('size-16')。onclick=size16;

在这种情况下,
大小
是随附的变量。调用
makeSizer(12)
返回一个“记住”12的函数引用。此函数引用被分配给元素上的单击处理程序(请参阅MDN示例中的其余代码)。它说:如果你点击我,调用(执行)
size12
。因此,单击时,正文的字体大小变为“12px”,因为执行了从
makeSizer(12)
返回的函数引用(附带值12)

如果您使用了该功能,您会立即调整字体大小

function makeSizer(size) {  
        document.body.style.fontSize = size + 'px';  
}
var size12 = makeSizer(12);  
var size14 = makeSizer(14);  
var size16 = makeSizer(16); //=> now the font-size of the body is '16px'
想想在这种情况下,如果您这样做:

document.getElementById('size-12').onclick = size12; 
如果单击
#size-12
,会发生什么情况

链接到的MDN页面链接到。试试看


好的或坏的事情我很乐意留给社区中更虔诚的部分。我想说这个闭包是有用的,甚至可能是方便的。

在这种情况下,
大小是封闭的变量。调用
makeSizer(12)
返回一个“记住”12的函数引用。此函数引用被分配给元素上的单击处理程序(请参阅MDN示例中的其余代码)。它说:如果你点击我,调用(执行)
size12
。因此,单击时,正文的字体大小变为“12px”,因为执行了从
makeSizer(12)
返回的函数引用(附带值12)

如果您使用了该功能,您会立即调整字体大小

function makeSizer(size) {  
        document.body.style.fontSize = size + 'px';  
}
var size12 = makeSizer(12);  
var size14 = makeSizer(14);  
var size16 = makeSizer(16); //=> now the font-size of the body is '16px'
想想在这种情况下,如果您这样做:

document.getElementById('size-12').onclick = size12; 
如果单击
#size-12
,会发生什么情况

链接到的MDN页面链接到。试试看


好的或坏的事情我很乐意留给社区中更虔诚的部分。我想说这个闭包是有用的,甚至是方便的。

没有一个更好,但它们的行为不同

在按如下方式调用返回的函数之前,第一个函数实际上不会调整大小:

size12();

第二个示例首先声明一个函数,然后调用它3次。立即将大小设置为12px,然后是14px,最后是16px。

没有一个更好,但它们的行为不同

在按如下方式调用返回的函数之前,第一个函数实际上不会调整大小:

size12();

第二个示例首先声明一个函数,然后调用它3次。您立即将大小设置为12px,然后设置为14px,最后设置为16px。

您的“好”标准是什么

在第一个示例中,您创建了一些函数,然后必须调用这些函数才能完成工作。这种尺寸是封闭的,很难看到任何好处。您可能需要执行以下操作:

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

var setSmall = makeSizer(8);
var setMedium = makeSizer(10);
var setLarge = makeSizer(14);
或者类似的,所以现在您只需调用:

setSmall();
第二种情况下的函数应该调用setSize之类的函数

封闭的另一个用途是:

var setSize = (function() {
  var sizes = {small: 8, medium: 10, large: 14};

  return function(size) {

    if (sizes.hasOwnProperty(size)) {
      document.body.style.fontSize = sizes[size] + 'px';
    }
  }
}());

setSize('small');

它们是“好的”、“坏的”还是别的取决于你对它们的分类标准。

你对“好”的标准是什么

在第一个示例中,您创建了一些函数,然后必须调用这些函数才能完成工作。这种尺寸是封闭的,很难看到任何好处。您可能需要执行以下操作:

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

var setSmall = makeSizer(8);
var setMedium = makeSizer(10);
var setLarge = makeSizer(14);
或者类似的,所以现在您只需调用:

setSmall();
第二种情况下的函数应该调用setSize之类的函数

封闭的另一个用途是:

var setSize = (function() {
  var sizes = {small: 8, medium: 10, large: 14};

  return function(size) {

    if (sizes.hasOwnProperty(size)) {
      document.body.style.fontSize = sizes[size] + 'px';
    }
  }
}());

setSize('small');

它们是“好”、“坏”还是其他取决于您对它们进行分类的标准。

在第一个示例中,
makeSizer
返回一个函数。在第二个示例中,它不返回任何内容,并且具有误导性的名称。两者完全不同

第一个示例中的推理是
makeSizer
是一个函数工厂;它具有“sizer”功能
size12
size14
size16
是由
makeSizer
制作的特殊“sizer”功能。如果稍后调用其中一个,它将设置字体大小


在第二个示例中,首先将字体大小设置为12,然后设置为14,然后设置为16,并在每个阶段将不感兴趣的返回值保存到一个变量中。

在第一个示例中,
makeSizer
返回一个函数。在第二个示例中,它不返回任何内容,并且具有误导性的名称。两者完全不同

第一个示例中的推理是
makeSizer
是一个函数工厂;它具有“sizer”功能
size12
size14
size16
是由
makeSizer
制作的特殊“sizer”功能。如果稍后调用其中一个,它将设置字体大小


在第二个示例中,首先将字体大小设置为12,然后设置为14,然后设置为16,然后在每个阶段将不感兴趣的返回值保存到变量中。

实际上,这里没有闭包示例

Wikipedia告诉我们a的定义是“函数以及该函数的非局部变量的引用环境”

更简单地说,它是一个“封闭”周围范围变量的函数

下面是一个很好的例子:

public Func<int> ClosureExample()
{
    int a = 1,
        b = 2;

    Func<int> closeIt = () => a + b;
    return closeIt;
}
public Func ClosureExample()
{
int a=1,
b=2;
Func closeIt=()=>a+b;
归还它;
}
让我们来看看这里面到底发生了什么。我们声明两个整数,然后使用lambda expression/closure/anonymous方法(都是指定给一类函数generic的定义的有效名称)返回将用于执行此计算的一类函数