首页 > 其他分享 >闭包函数:1.函数内部定义函数 2.内部函数使用了非它作用域的参数。

闭包函数:1.函数内部定义函数 2.内部函数使用了非它作用域的参数。

时间:2023-11-15 12:14:25浏览次数:29  
标签:闭包 f1 f2 outer 函数 作用域 num

执行以下程序,输出结果为()

function outer(){
       var num = 0;
        function inner(){
             num++;
             console.log(num);
       }
           return inner;
}

var f1 = outer();
 f1();
 f1();

 var f2 = outer();
 f2();
 f2();

A
1 2 3 4

B
1 1 1 1

C
1 2 1 2

D
1 1 2 2

正确答案:C

闭包变量为num,内部函数inner可以访问到外部函数outer的num变量,这相当于授权该变量可以被延迟使用,
每次调用外部函数时,都会开辟相应的内存空间,闭包变量num会保存在该内存空间中,直到该外部函数的内存空间被销毁。
在本题中,调用外部函数outer时开辟一个内存空间,变量num保存在该内存空间中,因此两次调用f1的输出结果为1 2;
当再次调用外部函数outer时,又重新创建一个内存空间,因此两次调用f2的输出结果同样为1 2。

闭包函数:1.函数内部定义函数 2.内部函数使用了非它作用域的参数。

闭包函数作用:1.延长参数的生命周期 2.变量私有化。

局部变量会常驻在内存中。

var f1 = outer();
f1();
f1(); // 变量常驻内存

每次外部函数执行的时 候,外部函数的引用地址不同,都会重新创建一个新的地址。

var f1 = outer();
var f2 = outer(); // 外部函数每次调用,都会开辟新的内存空间。

这其实是一道考察闭包和作用域链的问题。

f1、f2赋值执行了两次outer函数,所以创建了两个执行上下文,返回了两个闭包,都知道闭包会保留住父上下文的活动对象(es5以后是词法环境)不被销毁,所以这两个闭包保留的是两个父执行上下文的活动对象,而不是一个,所以f1的i会在f1执行多次的情况下累加,而f2的i会在f2执行多次的情况下累加,他们相互不冲突。

标签:闭包,f1,f2,outer,函数,作用域,num
From: https://www.cnblogs.com/longmo666/p/17833528.html

相关文章

  • 无涯教程-Dart - codeUnits函数
    返回给定字符串的UTF-16代码单元的列表。codeUnits-语法String.codeUnitscodeUnits-示例voidmain(){Stringstr="Hello";print(str.codeUnits);}它将产生以下输出-[72,101,108,108,111]参考链接https://www.learnfk.com/dart-programming/dart-......
  • 实例讲解数据库的定义重载函数
    本文分享自华为云社区《GaussDB数据库SQL系列-定义重载函数》,作者:Gauss松鼠会小助手2。一、前言在本文中,我们将介绍GaussDB数据库中的用户定义函数重载的概念、用法以及示例。用户定义函数是SQL中常用的“编程工具”,允许我们自定义函数来处理和操作数据。而函数重载则是指在......
  • 损失函数---训练集降低,验证集升高
     损失函数在训练集下降而在验证集上升,通常被称为过拟合(overfitting)的现象。这意味着模型在训练数据上表现得很好,但在新的、未见过的数据上表现较差。过拟合可能是由于模型过于复杂,以至于学到了训练数据中的噪声或细微特征,而这些特征在验证数据中并不普遍存在。 我通过降低学......
  • 实例讲解数据库的定义重载函数
    本文分享自华为云社区《GaussDB数据库SQL系列-定义重载函数》,作者:Gauss松鼠会小助手2。一、前言在本文中,我们将介绍GaussDB数据库中的用户定义函数重载的概念、用法以及示例。用户定义函数是SQL中常用的“编程工具”,允许我们自定义函数来处理和操作数据。而函数重载则是指在一个......
  • 无涯教程-Dart - truncate函数
    丢弃任何小数位后返回整数。truncate-语法Number.truncate()truncate-返回值返回不带小数点的int。truncate-示例voidmain(){doublen1=2.123;varvalue=n1.truncate();print("Thetruncatedvalueof2.123=${value}");}它将产生以下输出-......
  • SQL中的取整函数
    SQL中的取整函数FLOOR、ROUND、CEIL、TRUNC、SIGN(2009-12-2917:13:12)标签:整函数fromabs小数点绝对值教育分类:02.数据处理1trunc(value,precision)按精度(precision)截取某个数字,不进行舍入操作。2round(value,precision)根据给定的精度(precision)输入......
  • 无涯教程-Dart - Round函数
    此方法返回四舍五入到最接近整数的数字的值。Round-语法Number.round()Round-返回值返回四舍五入到最接近整数的数字的值。Round-示例voidmain(){doublen1=12.023;doublen2=12.89;varvalue=n1.round();print(value);value=......
  • 无涯教程-Dart - remainder函数
    在将两个数字相除后,它将返回截断的余数。remainder-语法Number.remainder(x)x-表示分隔线remainder-返回值返回除法的余数。remainder-示例voidmain(){vara=10;varb=17;print(a.remainder(2));print(b.remainder(2));}它将产......
  • f通过new关键词进行函数调用,之后无论如何都会返回一个与F关联的普通对象(因为不是通过
    varF=function(){};Object.prototype.a=function(){};Function.prototype.b=function(){};varf=newF();关于这段代码的描述,正确的是:Af能取到a,但取不到bBf能取到a,bCF能取到b,不能取到aDF能取到a,不能取到b正确答案:A网上有一道美团外卖的面试题是这样的:Function......
  • 无涯教程-Dart - Floor函数
    此方法返回小于或等于数字的最大整数。Floor-语法Number.floor()Floor-返回值返回小于或等于数字x的最大整数。Floor-示例voidmain(){vara=2.9;print("HiLearnfkThefloorvalueof2.9=${a.floor()}");}它将产生以下输出-HiLearnfkThefloor......