首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >自动调用Javascript闭包与手动调用Javascript闭包

自动调用Javascript闭包与手动调用Javascript闭包
EN

Stack Overflow用户
提问于 2018-04-22 03:40:00
回答 2查看 67关注 0票数 2

我把这两个闭包函数搞混了。

当我将该函数赋值给变量test时,doSomeMath返回该函数而不执行它。它只会在我测试()时运行闭包函数;但是对于showName函数则不是这样。一旦我传入这些值,它就会立即调用闭包函数,而不是返回它。

有人能给我解释一下吗?谢谢。

代码语言:javascript
运行
AI代码解释
复制
function showName (firstName, lastName) {
    var nameIntro = "Your name is ";
    // this inner function has access to the outer function's variables, including the parameter
    function makeFullName () {     
        var full = nameIntro + firstName + " " + lastName; 
        return full;   
    }

    return makeFullName ();
}

showName ("Michael", "Jackson"); // Your name is Michael Jackson


function doSomeMath(a, b) {
    var a = a;
    var b = b;

    function multiply() {
        var result = a * b;
        return result;
    }

    return multiply;
}

var test = doSomeMath(5,10);
test();
EN

回答 2

Stack Overflow用户

发布于 2018-04-22 04:46:20

这两个函数是演示闭包如何工作的两种不同方式。

你可以很容易地做相反的事情来达到同样的效果。

代码语言:javascript
运行
AI代码解释
复制
function doSomeMath(a, b) {
    var a = a;
    var b = b;

    function multiply() {
        var result = a * b;
        return result;
    }

    return multiply();
}

doSomeMath(5,10) //50

在上面的代码中,您返回内部函数的调用结果,而不是函数本身。在这里,正如你所看到的,multiply有一个5和10的闭包,所以你得到的结果是50。

类似地,尝试:

代码语言:javascript
运行
AI代码解释
复制
function showName (firstName, lastName) {
    var nameIntro = "Your name is ";
    // this inner function has access to the outer function's variables, including the parameter
    function makeFullName () {     
        var full = nameIntro + firstName + " " + lastName; 
        return full;   
    }

    return makeFullName;
}

var show = showName ("Michael", "Jackson");
show() //"Your name is Michael Jackson"

上面的代码返回内部函数,而不是它的调用,并反过来演示了内部函数makeFullName如何在外部函数的nameIntro变量上具有闭包。

另一个答案提供了对闭包的简明理解。要了解更多信息,请阅读closures以更好地理解上述示例。

票数 0
EN

Stack Overflow用户

发布于 2018-04-22 04:03:12

我认为你混淆了闭包和高阶函数。

没有手动调用函数的概念。必须始终调用函数。如果函数是闭包,这一点不会改变。

事实上,有人可能会说,这是闭包作为一种抽象机制的本质力量。

闭包是引用其封闭作用域中的元素的函数。

这通常被称为词法作用域。

闭包引用的封闭作用域的元素集称为闭包环境。

不引用其封闭作用域中的元素的函数可以被认为是退化闭包-具有空环境的闭包。

一个函数返回的值可以是另一个函数,但这与闭包的概念是完全正交的。

在JavaScript中,就像在许多语言中一样,函数是第一类值。这意味着它们可以存储在变量中,作为参数传递,并作为结果返回。

考虑一下

代码语言:javascript
运行
AI代码解释
复制
var createIncrement = function (incrementBy) {
  return function (value) {
    return value + incrementBy;
  };
};

上面的函数是高阶的,因为它返回一个函数。顺便说一下,它也是一个闭包,因为它引用了在封闭作用域中声明的incrementBy

在您的问题框架中表达的困惑很可能是因为在实践中,即使是最简单的JavaScript程序也会同时使用这两个特性。

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

https://stackoverflow.com/questions/49962276

复制
相关文章
llinux/重启/用户切换/注销
一.指令 shutdown命令 shutdown -h now //立即关机 shutdown -h 2 //分钟后关机 shutdown -r now //立即重启 shutdown -r 1 //1分钟后重启 sleep 30s //等待30秒来后面也可以运行程序 halt //关机 reboot //重启 sync //把内存的数据同步到磁盘,一般定时关机或者重启都要加这个指令放置信息丢失 init 0 //关机 init 6 //重启 二.定时关机脚本
小小咸鱼YwY
2020/06/19
2.9K0
linux用户的登录和注销
在 Linux 系统中,用户登录和注销是使用 Shell(命令行解释器)来完成的。本文将介绍如何在 Linux 系统中进行用户登录和注销的详细过程,并给出相应的示例。
玖叁叁
2023/04/09
6.3K0
idea。git撤销merge操作。并取消
该命令仅仅在合并后导致冲突时才使用。git merge --abort将会抛弃合并过程并且尝试重建合并前的状态。但是,当合并开始时如果存在未commit的文件,git merge --abort在某些情况下将无法重现合并前的状态。(特别是这些未commit的文件在合并的过程中将会被修改时)
DencyCheng
2020/05/25
8.8K0
修改用户ID和用户组ID
假定原用户和用户组id如下: 用户 admin 500 组 admin 500 要修改成用户和组id如下: 用户 admin 1000 组 admin 1000 修改用户ID usermod -u 1000 admin 修改组ID groupmod -g 1000 admin 修改文件权限 find / -user 500 -exec chown -h admin {} \; find / -group 500 -exec chgrp -h admin {} \;
kongxx
2018/12/21
2.7K0
Apache NiFi中的JWT身份验证
JSON Web Tokens为众多Web应用程序和框架提供了灵活的身份验证和授权标准。RFC 7519概述了JWT的基本要素,枚举了符合公共声明属性的所需编码,格式和已注册的声明属性名称(payload里属性称为声明)。RFC 7515中的JSON Web签名和RFC 7518中的JSON Web算法描述了JWT的支持标准,其他的比如OAuth 2.0框架的安全标准构建在这些支持标准上,就可以在各种服务中启用授权。
@阿诚
2022/03/04
4.2K0
微服务系列-认证策略
在服务众多的微服务体系中,使用单点登录方案是一个好的解决方式。也意味着每个面向用户的服务都必须和认证服务交互,这会带来琐碎的流量,同时方案实现起来较复杂。 分布式会话: 将用户认证信息存储在共享存储中,通畅由用户会话作为key来实现的简单分布式哈希映射,当用户访问微服务时,用户数据可以从共享存储中获取。 客户端令牌: 令牌在客户端产生,有身份认证服务进行签名,必须包括足够多的信息,以便在微服务中建立用户身份。令牌附加在每个请求上,为微服务提供用户身份认证。 这种方案安全性相对较好,身份验证注销是一个问题
春哥大魔王
2018/04/16
7240
微服务系列-认证策略
Restful安全认证及权限的解决方案
一、Restful安全认证常用方式  1.Session+Cookie  传统的Web认证方式。需要解决会话共享及跨域请求的问题。  2.JWT  JSON Web Token。  3.OAuth 
庞小明
2018/03/09
2.9K0
Restful安全认证及权限的解决方案
撤销 git add . 并保留修改的方法
执行完 git add . 才发现没有在对应的分支,如何撤回呢? 可以参考下面的方法: 文件退出暂存区,但是修改保留: git reset --mixed 撤销所有的已经 add 的文件: git reset HEAD . 撤销某个文件或文件夹: git reset HEAD  -filename 另外:可以用 git status Git 会告诉你可以通过那个命令来执行操作。 未经允许不得转载:w3h5 » 撤销 git add . 并保留修改的方法
德顺
2022/01/12
33.6K0
linux之开机、重启和用户登录注销
一、开机和重启 shutdown: shutdown -h now:立即关机 shutdown -h 1:1分钟后关机 shutdown -r now:立即重启 halt:直接使用,相当于立即关机 reboot:重启 sync:把内存的数据同步到磁盘(建议关机或重启之前先执行,防止数据丢失) 二、用户登录和注销 使用su-用户名指令可以直接切换为不同用户。 在远程连接时,而不是在linux终端,使用logout可注销用户。
西西嘛呦
2020/08/26
3.6K0
WinCC脚本应用之用户登录/注销
Simatic WinCC项目中的用户管理可用来分配和管理运行系统中操作的访问,简单来说就是规定张三可以点击这个按钮,李四不可以修改过程数据。既然有用户就会有用户登录/注销这个操作,通常我们习惯组态“登录”和“注销”按钮来实现这个操作,按钮事件下可以组态C脚本调用相应的ODK函数。而VBS脚本中没有直接提供用户登录/注销的对象或者方法,但是我们仍然可以在VBS脚本间接的实现这个功能。
科控物联
2022/03/28
10K0
WinCC脚本应用之用户登录/注销
JavaWeb 基于Session的用户登陆注销实现
  通过Session来存储用户的部分登陆信息来验证用户是否在线,这应该时最容易实现的一种Web端方案,本文以SSM(Spring、SpringMVC、myBatis)框架为载体,来具体实现这套登陆系统。
Rekent
2018/09/04
2.3K0
分享一篇详尽的关于如何在 JavaScript 中实现刷新令牌的指南
刷新令牌允许用户无需重新进行身份验证即可获取新的访问令牌,从而确保更加无缝的身份验证体验。这是通过使用长期刷新令牌来获取新的访问令牌来完成的,即使原始访问令牌已过期也是如此。
前端达人
2023/08/31
4640
分享一篇详尽的关于如何在 JavaScript 中实现刷新令牌的指南
Linux之开机、重启和用户登录注销等操作
1. 关机&重启命令 基本介绍 立刻进行关机 shutdown -h now 显示提示信息后再关机:“hello,1分钟后会关机了” shutdown -h 1 "hello,1分钟后会关机了" 现在立刻重新启动计算机 shutdown -r now 或 reboot 关机,作用和上面的一样。但不是正常关机,这是关闭内存 half 或 int 0 把内存和数据同步到磁盘 sync 2. 注意细节 不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中 目前的 shutdown/rebo
兮动人
2021/06/11
1.8K0
Linux 虚拟机关机、重启和用户登录注销
# Linux 虚拟机关机、重启和用户登录注销 # 关机&重启命令 # 基本介绍 shutdown -h now 立该进行关机 shutdown -h 1 "hello,1分钟后会关机了" shutdown -r now 现在重新启动计算机 halt 关机,作用和上面一样. reboot 现在重新启动
用户9615083
2022/12/25
2.6K0
基础SQL-DCL语句-创建用户-授权用户-撤销授权-查看权限-删除用户-修改用户密码
我们一般默认使用的都是root用户,超级管理员,拥有全部的权限。但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库。所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限来管理和维护数据库。
Devops海洋的渔夫
2022/01/17
1.4K0
基础SQL-DCL语句-创建用户-授权用户-撤销授权-查看权限-删除用户-修改用户密码
单点登录原理与简单实现 原
web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系
wuweixiang
2018/08/14
9090
单点登录原理与简单实现
                                                                            原
单点登录原理与简单实现
web应用通常采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系。
Bug开发工程师
2018/09/21
1.1K0
单点登录原理与简单实现
点击加载更多

相似问题

烧瓶--如何撤销令牌/注销

110

Spring security。如何注销用户(撤销oauth2令牌)

8555

Laravel护照单元注销/撤销令牌测试

20

如何FOSOAuthServerBundle“注销”或更好地撤销令牌

24

如何注销(即撤销、删除或使令牌失效)?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档