首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >自动调用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

复制
相关文章
Javascript闭包
越来越觉得国内没有教书育人的氛围,为了弄懂JS的闭包,我使出了我英语四级吃奶的劲去google上搜寻着有关闭包的解释,当我看到stackoverflow上这一篇解答,我脑中就出现了一句话:就是这货没跑了!
用户1065635
2019/03/21
7970
JavaScript闭包
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
7430
JavaScript闭包
在JavaScript中,闭包是指在一个函数内部创建另一个函数,并且这个内部函数可以访问其外部函数的变量、参数和内部函数自身的局部变量。简而言之,闭包是一个包含有自由变量的函数,这些变量被绑定在函数创建时所处的环境中。
堕落飞鸟
2023/05/17
8510
JavaScript 闭包
闭包: 闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量。 也就是,两个嵌套关系的函数,内部函数可以访问外部函数定义的变量。 是通过作用域链,进行逐层查找并访问的 闭包的优点: 形成私有化空间,避免全局变量污染 持久化内存,保存数据 闭包的缺点: 由于持久化内存,导致内存泄漏 闭包主要用用场景: 实现分段计算 数据保护 缓存数据 闭包例子 function makeFunc() { const uname = 'Tricia' function di
且陶陶
2023/04/12
4540
javascript - 闭包
今天群里聊到JS的闭包,说是不理解。我看了下那个PDF的截图上的内容,。。。。我就看了一小会,反正也没看太看懂,写的太玄幻。。 我就觉得这个吧,看不懂闭包,其实也正常。因为看懂了反正一时你也用不上。。看不懂别着急,慢慢的就看懂了。 ============ 直白点讲,闭包就是函数套函数, function a(){ var aVal = '123'; function b(){ console.log( aVal ); } return b; } a()(); //123 这,就是一个最简单的闭包
web前端教室
2018/02/06
5990
JavaScript闭包
函数和对其词法环境lexical environment的引用捆绑在一起构成闭包,也就是说,闭包可以让你从内部函数访问外部函数作用域。在JavaScript,函数在每次创建时生成闭包。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
WindRunnerMax
2020/10/20
1.1K0
JavaScript闭包
init() 创建了一个局部变量 name 和一个名为 displayName() 的函数。displayName() 是定义在 init() 里的内部函数,并且仅在 init() 函数体内可用。displayName() 没有自己的局部变量。然而,因为它可以访问到外部函数的变量,所以 displayName() 可以使用父函数 init() 中声明的变量 name 。
闲花手札
2021/11/15
6250
Javascript 闭包
1. 创建一个函数poll,它接受两个参数checkStatus[函数],callback[函数]。 2. poll会调用checkStatus,checkStatus返回true或者false。 3. 如果checkStatus返回true,调用callback并结束 4. 如果checkStatus返回false,1.5秒后继续调用checkStatus,如果还是返回false,1.5×2秒后继续调用checkStatus,还是false的话,1.5×3秒后继续调用,以此类推。 5. 不可以使用全局变量。
上山打老虎了
2022/06/14
3550
JavaScript闭包
其实关于闭包各个论坛社区里都有很多的文章来讲它,毕竟闭包是JavaScript中一个特色,也正因为这个雨中不同的特色也让闭包理解起来有一些吃力。笔者在这里不仅仅是想介绍闭包,也向列举一些笔者所见过的一些闭包,如果有读者还有一些比较经典的闭包例子,希望可以在评论区里留一下,谢谢。
IMWeb前端团队
2019/12/03
4720
javascript闭包
## 定义 **闭包:**有权访问另一个函数作用域中的变量的函数。 ## 解析 相信刚看到这个定义,很多人肯定很迷糊,现在给出示例。 ``` function func1(){ var a = 1; function func2(){ a++; console.log(a); }; return func2; } var res = func1();//等于func2 res();//等于func2(),输出2 ``` 首先定义了func1,
用户1624346
2018/04/10
7740
JavaScript 闭包
闭包(closure)是 Javascript 语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
RiemannHypothesis
2022/10/28
3930
JavaScript闭包
IMWeb前端团队
2017/12/29
7470
JavaScript闭包
有权访问另一个函数作用域内变量的函数都是闭包。这里 couter 函数访问了构造函数 a 里面的变量 n,所以形成了一个闭包。 再来看一段代码:
grain先森
2019/05/05
7060
JavaScript闭包
JavaScript闭包
做前端的可太需要了解闭包了,几乎每个面试都会问到闭包,闭包的重要性不言而喻。什么是闭包:闭包一般是指那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。
大熊G
2022/11/14
3680
JavaScript闭包
输入:f1 输出:function f1() //返回一个function对象的f1
HaC
2020/12/30
3370
JavaScript闭包
Javascript 闭包与变量
JavaScript中的作用域链的机制引出了一个副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象,而不是某个特殊的值。
大道七哥
2019/09/10
4790
javascript 闭包
在A中返回B的引用 如果一个对象不再被引用,那么这个对象就会被GC回收,否则这个对象一直会保存在内存中。
达达前端
2019/07/15
4370
JavaScript 闭包
全局和局部变量即便名称相同,它们也是两个不同的变量。修改其中一个,不会影响另一个的值。
陈不成i
2021/07/19
3070
Javascript 闭包
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
超级大帅比
2021/09/05
4260
JavaScript闭包(Closure)
上面的代码中,函数 f2 就被包括在函数 f1 内部,这时 f1 内部的所有局部变量,对 f2 都是可见的。
Leophen
2019/08/23
5830

相似问题

闭包javascript调用

41

Javascript闭包计数调用

12

JavaScript闭包与本地闭包

33

Python闭包与javascript闭包

23

javascript,关于闭包函数调用

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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