TOGOUTECH

JavaScript:自调用函数返回一个闭包。它是做什么用的?

coder 2024-07-30 原文

在研究一个 JavaScript 库时,我发现了以下结构:

theMethod: function () {
    var m1 = new SomeClass();
    return function (theParameter) {
        this.someMethod();
        m1.methodCall(this.someField1);
        this.someField2 = 'some value';
    }
}()

方法调用如下:

c.theMethod(paramValue);

作者想通过这个声明表达什么?

为什么不使用这样的声明:

theMethod: function (theParameter) {
    var m1 = new SomeClass();
    this.someMethod();
    m1.methodCall(this.someField1);
    this.someField2 = 'some value';
}

最佳答案

在函数外声明变量使得函数每次都使用同一个对象。

一个示例(为简单起见,使用整数而不是对象):

var c = { 
    theMethod: function () {
        var m1 = 0;
        return function (theParameter) {
            m1++;
            console.log( m1 );
        }
    }()
};

c.theMethod(); c.theMethod();  // output: 1 2


var d = { 
    theMethod: function () {
        return function (theParameter) {
            var m1 = 0;
            m1++;
            console.log( m1 );
        }
    }()
};

d.theMethod(); d.theMethod();  // output: 1 1

自调用函数是这样工作的:

var c = { 
    theMethod: function () {
        var m1 = 0;
        return function (theParameter) {
            m1++;
            console.log( m1 );
        }
    }()
};

当创建对象 c 时,自调用函数调用自身并且 theMethod 现在等于该函数的返回值。在这种情况下,返回值是另一个函数。

c.theMethod = function( theParameter ) {
    m1++;
    console.log( m1 );
};

变量 m1 可用于该函数,因为它在函数定义时处于范围内。

从现在开始,当您调用 c.theMethod() 时,您总是在执行自调用函数返回的内部函数,该函数本身仅在声明对象时执行一次.

自调用函数就像任何函数一样工作。考虑:

var c = { 
    theMethod: parseInt( someVariable, 10 )
};

您不希望每次使用c.theMethod 变量时都执行parseInt()。将 parseInt 替换为原始函数中的匿名函数,它完全一样。

关于JavaScript:自调用函数返回一个闭包。它是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17235259/

有关JavaScript:自调用函数返回一个闭包。它是做什么用的?的更多相关文章

  1. javascript - 组合与多重继承有何不同? - 2

    在某些情况下,提倡组合而不是继承。我看到这种情况在Ruby和Javascript社区中越来越多地发生。组合听起来很像多重继承。我什至在一些Ruby实现的内部读到过,模块组合是带有少量语法糖的多重继承。是一样的吗?如果不是,它与多重继承有何不同? 最佳答案 这取决于您所说的“多重继承”和“组合”是什么意思。如果组合和继承都只是意味着添加到对象响应的消息列表中,那么它们在定义上是相等的。假设类很简单virtualtables方法,并且语言中的每个对象都是由对类和一些数据的引用定义的。如果对象通过调用与其类关联的方法查找函数来响应消息,并

  2. javascript - AngularJS $http : how to avoid redirect following - 2

    在AngularJS应用程序中,我对服务器url进行$http.post调用。此url的成功响应是30x重定向,我的问题是$http.post严格遵循此重定向并在成功回调中返回最终调用的结果。我想拦截此重定向并手动将用户重定向(更改浏览器url)到最终页面。可能吗? 最佳答案 根据docs,$http服务是一个核心Angular服务,它通过浏览器的XMLHttpRequest对象或通过JSONP促进与远程HTTP服务器的通信。了解这一点,并了解XMLHttpRequest的规范,拦截重定向可能是不可能的。W3CspecforXMLH

  3. javascript - Iron Router 和 Meteor 中的服务器端路由 - 2

    转发似乎在Meteor中,我们无法调用服务器端路由来将文件呈现到页面,而无需从我们的正常工作流程中进行某种变通,根据我所阅读的有关服务器端路由的内容。我希望我在这一点上是错的,并且有一种简单的方法可以实现我想要做的事情......**抱歉,如果这有点长,但我认为在这种情况下提供更多的背景和上下文是必要的**软件/版本我正在使用最新的IronRouter1.*和Meteor1.*并且开始时,我只使用帐户密码。背景/语境我有一个onBeforeAction,它只是根据用户是否登录将用户重定向到欢迎页面或主页:两者/routes.jsRouter.onBeforeAction(functio

  4. javascript - 通过使用带有 CSS 的图像显示背景网格 - 2

    UPDATEDDEMO工作得很好,除了当我改变时背景图像正在调整大小:background-size:20px20px;是否可以保持原图大小,让背景图重叠(隐藏图片超出左上框(20px20px)的部分)?B计划是在设置的base64图像内容中用JS裁剪图像... 最佳答案 使用只有左边框和上边框的svg图像可能就是您要找的东西?检查片段,或这个jsfiddle(fiddle包含放大/缩小网格的按钮):body{background:url('http://testbed.nicon.nl/img/_FBs3b.svg')repeat

  5. javascript - 在 Angular.js 中有条件地显示链接 - 2

    基本上,我的模板中有这段代码:{{entry.school}}{{entry.school}}...如您所见,我试图在entry.url不为空时显示可点击的URL,否则显示纯文本。它工作正常,但看起来很丑陋。有没有更优雅的解决方案?我能想到的另一种方法是使用ng-if:{{entry.school}}{{entry.school}}但是我会重复几乎相同的比较两次,这看起来更糟。你们会如何处理这个问题? 最佳答案 你可以试试。hellohello但是ngSwitch您正在使用的应该没问题。

  6. javascript - 如何从其他 Controller 关闭 Angular-ui 模式 - 2

    我正在使用Angular-ui弹出一个带有表单的模式。我的代码是:app.controller('NewCaseModalCtrl',['$http','$scope','$modal',function($http,$scope,$modal,$log){$scope.items=['item1','item2','item3'];$scope.open=function(size){varmodalInstance=$modal.open({templateUrl:'modal-new-case.html',controller:'ModalInstanceCtrl',size:s

  7. javascript - 国际键盘如何处理 JavaScript 键盘事件? - 2

    我写了atexteditorinJavaScriptthatdrawsdirectlytoaCanvaselement(出于各种原因,但我的主要原因是我可以将该Canvas作为纹理贴在WebGL网格上)。令人高兴的是,实现我发现的任何内容可编辑解决方案都更容易。我很早就注意到的一件事是使用en-USQWERTY以外的键盘布局的人提示某些键显示不正确的字母。在对Windows的语言设置和屏幕键盘进行了一些摆弄之后,我创建了一个基于代码页的解决方案,该解决方案将keyCode直接映射到不同语言环境的字符串,而不是仅仅假设“没有修饰键的keyCode51是数字3”。因为它不是,所以在某些键盘

  8. javascript - 没有唯一键的 lodash indexBy - 2

    我如何使用非唯一键索引数组。我尝试使用lodashindexBy,但它没有给出预期的结果。varkeys=[{'dir':'left','code':97},{'dir':'left','code':100},{'dir':'right','code':50},{'dir':'right','code':51}];vara=_.indexBy(keys,'dir');结果:{left:{dir:'left',code:100},right:{dir:'right',code:51}}预期结果:{left:[{dir:'left',code:100},{'dir':'left','cod

  9. javascript - 如何在没有后视的情况下匹配 '+abc' 而不是 '++abc'? - 2

    一句话类似:Loremipsum+dolor++sitamet.我想匹配+dolor但不是++sit.我可以通过回顾来做到这一点,但是因为JavaScript不支持它我正在努力为它建立一个模式。到目前为止,我已经尝试过:(?:\+(.+?))(?=[\s\.!\!])-butitmatchesbothwords(?:\+{1}(.+?))(?=[\s\.!\!])-thesamehere-bothwordsarematched令我惊讶的是这样的模式:(?=\s)(?:\+(.+?))(?=[\s\.!\!])不匹配任何东西。我以为我可以欺骗它并使用\s或者稍后还有^在+之前签名,但它似

  10. javascript - 将元素的内容打印到控制台 - 2

    我有一个将内容动态输出到元素的提要。我想从元素A中获取文本并将其输出到控制台日志。例子:ID5667控制台输出:编号:ID5667我已经尝试了一些方法,但要么是未定义的,要么是该元素的完整HTML。 最佳答案 我认为下面的内容应该适合您。varresult=document.getElementsByClassName("elementa")[0].innerHTML;console.log(result);更多引用:getElementByClassName 关于javascript-

随机推荐