什么是JavaScript中嵌套函数的需要和使用

时间:2017-06-11 10:13:42

标签: javascript nested-function

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

4 个答案:

答案 0 :(得分:7)

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

  1. Non-Polluted Global Namespace
  2. Modularization功能
  3. 封装modules
  4. 的私人内部工作方式
  5. 防止不同脚本之间的标识符冲突
  6. 由于嵌套作用域内的变量符合minification的条件,因此脚本大小较小。
  7. 加快Identifier Resolution Process
  8. 这是一个示例模块,显示函数嵌套和范围提供的封装功能:

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

答案 1 :(得分:4)

这不是关于效率,而是关于范式。如果您使用脚本范例,您可以毫无后顾之忧地编写代码。如果使用经典范例,则需要定义类,但不需要嵌套函数。不过,在脚本和经典中,如果你愿意,可以使用嵌套函数。

只有切换到功能范例(javascript的实际“原生”范例),在某些情况下才能 NEED 嵌套函数。

只要你不使用函数式编程,就不会充分利用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()); });

单击f时会执行此#id,但您无法执行任何操作。在调用a时,参数bcreate()已经嵌入。

这意味着您可以隐藏信息并利用上下文范围。想象一下,创建者用户是两个不同的代码库,不是由同一个人编写的。或者ab是其他代码库保留的秘密。

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

  

如果你想知道为什么我们离不开,那么请看curryingmonads,它们是功能范例的基本组成部分。您需要一些机制来执行这些基本操作,否则范例无法正常运行。

答案 2 :(得分:1)

JavaScript变量可以属于本地或全局范围。

全局变量可以通过闭包制作本地(私有)。

JS中的

函数就像变量一样,所以如果可能想使用嵌套函数供本地使用。

  

这是一个很好的example

答案 3 :(得分:1)

首先,在编程中有几种方法可以完成任务但是在它们中我们必须选择一种在内存和执行时间方面高效且快速的方法。当你需要从主程序切换到子程序时如果子程序的大小较小,则上下文切换的时间不仅仅是执行内联任务。如果尺寸较小则总体上是有益的,否则你总是有一个替代路径。而且嵌套函数可以访问范围&#34 ;上述"它们将减少将参数传递给函数并在程序中的其他地方重用它的麻烦。所有上述变量和函数都可以被这个嵌套函数访问并且可以更新它们。