首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript中嵌套函数的需要和用法是什么

问JavaScript中嵌套函数的需要和用法是什么
EN

Stack Overflow用户
提问于 2017-06-11 18:13:42
回答 4查看 4.8K关注 0票数 9

我知道什么是嵌套函数,但我不明白为什么我们首先需要嵌套函数。是否存在只能通过在JavaScript中使用嵌套函数来解决的问题。我看到的所有创建嵌套函数的示例都可以在不在函数内部创建函数的情况下进行编码,并将产生相同的结果。因此,哪个问题需要创建嵌套函数,并且只能通过使用嵌套函数来有效地解决。

EN

回答 4

Stack Overflow用户

发布于 2017-06-11 18:24:26

嵌套函数的核心重要性是作用域生成。我们需要JavaScript中的嵌套函数和作用域来实现以下功能。

functionality

  • Encapsulate的
  1. Non-Polluted Global Namespace
  2. Modularization modules
  3. Prevent的私有内部工作跨不同scripts
  4. Smaller脚本大小的标识符冲突,这是因为嵌套范围内的变量符合minification.
  5. It的条件,从而加快了Identifier Resolution Process

的速度

下面是一个示例模块,它展示了函数嵌套和作用域提供的封装功能:

代码语言:javascript
复制
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)也将附加到窗口对象,并增加浏览器解析标识符引用所需的工作量。

票数 9
EN

Stack Overflow用户

发布于 2017-06-11 18:25:06

这不是效率的问题,而是范例的问题。如果你使用脚本范例,你就可以不用担心地编写代码了。如果使用经典范例,则需要定义类,但不需要嵌套函数。尽管如此,在脚本和经典脚本中,如果您愿意,您可以使用嵌套函数。

只有当您切换到函数式范例时,在某些情况下才需要嵌套函数。

只要不使用函数式编程,就不会充分利用javascript的强大功能。这是一个使用闭包的工厂示例,否则不能使用闭包(嵌套函数还有其他几种用途,而不仅仅是闭包):

代码语言:javascript
复制
function create(a, b)
{
  function compute()
  {
    return a + b;
  }

  return {
    "compute": compute
  };
}

用户代码将执行以下操作:

代码语言:javascript
复制
f = create(19, 73);

不需要计算任何东西。比方说,这需要很多时间来计算,除非有必要,否则你不想计算它。您现在可以将函数f传递给不属于您的其他代码(例如,jQuery事件处理程序代码):

代码语言:javascript
复制
$("#id").on("click", function () { console.log(f.compute()); });

当您单击#id时,将执行此f,但您无法对其执行任何操作。在调用create()时,参数a和b已经嵌入。

这意味着您可以进行信息隐藏并利用上下文作用域。假设创建者和用户是两个不同的代码库,而不是由同一个人编写的。或者a和b是要对其它代码库保密的秘密。

查找我在上面的文本中散布的各种单词,以了解有关函数式编程的更多信息。

如果你想知道为什么我们离不开它们,那么看看currying和monads,它们是函数式范式的基础部分。您需要一些机制来执行这些基本操作,否则范例将无法发挥作用。

票数 4
EN

Stack Overflow用户

发布于 2017-06-11 18:24:36

JavaScript变量可以属于局部或全局作用域。

使用闭包可以使全局变量成为局部(私有)变量。

JS中的函数类似于变量,因此如果想要使用嵌套函数以供本地使用。

这里有一个好的example

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44482643

复制
相关文章

相似问题

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