Javascript 你需要一个函数吗?
我想知道这两种声明之间有什么区别:Javascript 你需要一个函数吗?,javascript,Javascript,我想知道这两种声明之间有什么区别: var delay = (function() { var timer = 0; return function(callback, ms) { clearTimeout (timer); timer = setTimeout(callback, ms); }; })(); function delay { var timer = 0; return function(callback
var delay = (function() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
function delay {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
}
在第二种情况下,放弃返回的函数 如果我理解你的问题是正确的,那就是如果你希望第二个案例
function delay() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
}
那么区别在于,存储在delay中的代码不会被执行。如果稍后调用delay,那么它将是等效的,不同之处是函数的匿名性和
delay
的值(在第一种情况下是内部函数,在第二种情况下是外部函数)。第一种情况使用函数表达式生成匿名函数,立即调用,将计时器
变量包装在闭包中,并返回另一个函数(使用函数表达式生成)
第二种情况是语法错误(因为函数表达式没有上下文,函数声明也没有名称)
既然你现在已经编辑过了
第二种情况现在使用函数声明,但不调用函数。因此,它现在将执行匿名函数所执行的操作(而不是返回函数所执行的操作) 在第一种情况下,创建然后调用匿名函数。在第二种方法中,创建一个匿名函数,但既不调用它,也不将其保存在变量中。我甚至不确定这是否合法。让一个函数返回另一个函数的目的是为在函数外部声明的变量创建一个作用域,而不必全局声明它们。外部函数在创建后立即执行(通过在声明后加括号),因此内部函数返回并分配给变量 在第一个示例中,内部函数中使用了
timer
变量,因此创建了包含该变量的闭包。当您以后使用该函数时,它仍然可以访问timer
变量,尽管它不在函数内部。执行外部函数以返回内部函数,并将其分配给delay
变量
讨论这两个声明之间的差异是毫无意义的。第二个声明只声明外部函数,但它既不存储也不执行,因此被丢弃
编辑:在更新的问题中(如果通过在第二个声明中的函数名后添加括号进行更正),第二个声明是一个函数,它返回与第一个声明中分配给变量的结果相同的结果。因此,要获得相同的结果,必须调用函数并将返回值赋给变量:
var d = delay();
现在
d
变量包含的内容与第一个示例中的delay
变量相同。第一个函数声明使用匿名函数在变量timer
上创建闭包,第二个匿名函数使用timer
避免污染全局命名空间。这是一种在JavaScript函数中实现数据隐藏和静态变量的简单而方便的技术
这个first/outer函数通常只使用一次,这就是为什么它从未被命名,而是作为匿名函数立即执行的原因。但是,如果您需要能够为多个事件创建多个计时器,则情况正好相反
考虑以下几点:
var delayBuilder = function() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
}
现在:
相当于:
var delay = delayBuilder();
因此,如果需要多个延迟(同时运行多个计时器),可以执行以下操作:
var delay1=delayBuilder(),
delay2=delayBuilder(),
...
delayN=delayBuilder()
更一般地说,您有一个函数来构建函数,换句话说funcBuilder
和func
(使用“func”,因为“function”是保留字)
因此,如果函数生成器更复杂,并且您想要一个单独的、可丢弃的实例,那么您可以这样做
funcBuilder(configurationifany)(etc, etc);
或者,对于您发布的代码(尽管这对于简单地包装setTimeout
来说是过分的,但只是为了继续这个示例):
这实际上可以归结为用法。如果您不打算多次使用函数生成器,那么保留它是没有意义的,将其作为匿名函数执行更合适。如果需要构建该函数的多个实例,则保存对函数生成器的引用是有意义的。但是如果是
function delay(){…}
,那么区别在于,在第一种情况下,delay被分配给内部函数,即外部函数的返回值。在第二种情况下,它将是外部功能。在第一种情况下它被调用,在第二种情况下它没有被调用。在第二种情况下,代码没有被执行,所以它不能返回任何东西。Guffa,一旦被调用它就可以;-)我的意思是,它存储在变量中,所以没有什么可以阻止以后调用它。重复的。不是真正的重复,问题略有不同。注意分配给delay
:D的值末尾的()
// And of course, used as:
delay1(callback, ms);
var func = funcBuilder(configurationifany);
funcBuilder(configurationifany)(etc, etc);
delayBuilder()(callback, ms);