我知道什么是嵌套函数,但我不明白为什么我们首先需要嵌套函数。是否存在只能通过在JavaScript中使用嵌套函数来解决的问题。我看到的所有创建嵌套函数的示例都可以在不在函数内部创建函数的情况下进行编码,并将产生相同的结果。因此,哪个问题需要创建嵌套函数,并且只能通过使用嵌套函数来有效地解决。
发布于 2017-06-11 18:24:26
嵌套函数的核心重要性是作用域生成。我们需要JavaScript中的嵌套函数和作用域来实现以下功能。
functionality
的速度
下面是一个示例模块,它展示了函数嵌套和作用域提供的封装功能:
var notificationService = (function ($, toastr, undefined) {
var _externals = {},
_jqExtend = $.extend;
/*
* Private Methods
*/
function _showMessage(params) {
params = params || {};
toastr.remove();
if (typeof (params.title) === "undefined")
toastr[params.method](params.msg);
else
toastr[params.method](params.msg, params.title);
}
/*
* Public Members
*/
_externals.clear = function () {
toastr.remove();
};
_externals.showError = function (params) {
params = params || {};
_jqExtend(params, {
method: "error"
});
_showMessage(params);
};
_externals.showInfo = function (params) {
params = params || {};
_jqExtend(params, {
method: "info"
});
_showMessage(params);
};
_externals.showSuccess = function (params) {
params = params || {};
_jqExtend(params, {
method: "success"
});
_showMessage(params);
};
_externals.showWarning = function (params) {
params = params || {};
_jqExtend(params, {
method: "warning"
});
_showMessage(params);
};
return _externals;
})(jQuery, toastr);上面的代码让我们能够控制要公开的东西。在此特定情况下,通过引用notificationService对象将附加到_externals对象的所有成员公开给全局命名空间。在不使用作用域的情况下,内部成员(_jqExtend和_showMessage)也将附加到窗口对象,并增加浏览器解析标识符引用所需的工作量。
发布于 2017-06-11 18:25:06
这不是效率的问题,而是范例的问题。如果你使用脚本范例,你就可以不用担心地编写代码了。如果使用经典范例,则需要定义类,但不需要嵌套函数。尽管如此,在脚本和经典脚本中,如果您愿意,您可以使用嵌套函数。
只有当您切换到函数式范例时,在某些情况下才需要嵌套函数。
只要不使用函数式编程,就不会充分利用javascript的强大功能。这是一个使用闭包的工厂示例,否则不能使用闭包(嵌套函数还有其他几种用途,而不仅仅是闭包):
function create(a, b)
{
function compute()
{
return a + b;
}
return {
"compute": compute
};
}用户代码将执行以下操作:
f = create(19, 73);不需要计算任何东西。比方说,这需要很多时间来计算,除非有必要,否则你不想计算它。您现在可以将函数f传递给不属于您的其他代码(例如,jQuery事件处理程序代码):
$("#id").on("click", function () { console.log(f.compute()); });当您单击#id时,将执行此f,但您无法对其执行任何操作。在调用create()时,参数a和b已经嵌入。
这意味着您可以进行信息隐藏并利用上下文作用域。假设创建者和用户是两个不同的代码库,而不是由同一个人编写的。或者a和b是要对其它代码库保密的秘密。
查找我在上面的文本中散布的各种单词,以了解有关函数式编程的更多信息。
如果你想知道为什么我们离不开它们,那么看看currying和monads,它们是函数式范式的基础部分。您需要一些机制来执行这些基本操作,否则范例将无法发挥作用。
发布于 2017-06-11 18:24:36
https://stackoverflow.com/questions/44482643
复制相似问题