首页 > 其他分享 >箭头函数表达式的语法比函数表达式更简洁,并且没有自己的 this、arguments、super 或 new.target 。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且不能用作构造函数。

箭头函数表达式的语法比函数表达式更简洁,并且没有自己的 this、arguments、super 或 new.target 。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且不能用作构造函数。

时间:2023-11-15 12:34:01浏览次数:40  
标签:20 函数 箭头 num test return 表达式

请问以下JS代码最终输出的结果和num值分别是多少?

var test = (function() {
  var num = 0
  return () => {
      return num++
  }
}())
for (var i = 0; i < 20; i++) {
  test()
}
console.log(test());

A
20、20

B
20、21

C
21、21

D
21、20

正确答案:B

test函数的作用就是让num值自增(这里涉及到闭包),只不过因为是num++
所以最终返回的值是还没有完成本次自增的num值即20,而num本身已经完成自增是为21。

var test = () 

// 可以将上面的代码拆分开分析一下,下面是()里的代码,外面的()只是为了符合语法。
// 下面是一个自执行函数,一开始它自己调用自己一次,将箭头函数返回给 var test。
function() {
  var num = 0
  return function() {
    return num++
  }
}()

// 那 var test 现在就是一个函数了。
// 在返回箭头函数的时候,函数里引用了第6行的num,所以该函数不进行销毁。
// 如果销毁了,那么test()的时候,num就不翼而飞,找不到了。

// 现在 test就相当于
var test = function() {
  return num++;
}

for (var i = 0; i < 20; i++) {
  test()
  // 这里就相当于调用了20次的test,test存储的num也就变成了20
}

console.log(test());
// 最后又输出了一次,num+1,变成了21。

num = 0,test()进入循环;循环内 i = 0时,return num = 0,但return后 num 自增1,所以此时num = 1;

则如上,i = 19,return num = 19,此时num自增1,num = 20;

第10行代码,test()执行一次再被打印,则return num = 20, 此时num自增1,所以num = 21,选B

上来立即执行函数先执行,返回一个箭头函数,但是没被调用,所以不执行num++。
然后循环,这里是test()也就是执行返回的箭头函数,所以从这里开始 num++

立即调用函数表达式:IIFE( 立即调用函数表达式)是一个在定义时就会立即执行的 JavaScript 函数。

箭头函数:箭头函数表达式的语法比函数表达式更简洁,并且没有自己的 this、arguments、super 或 new.target 。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且不能用作构造函数。

闭包:一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。闭包让你可以在一个内层函数中访问到其外层函数的作用域。在JavaScript中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

代码运行逻辑:
循环中执行 test() 函数,即相当于如下代码所示:

for (var i = 0; i < 20; i++) {
() => {
return num++; // 循环未执行时,num === 0;循环结束时,num === 20。
};
};
因为函数 test() 构成闭包,所以匿名箭头函数仍然可以访问到其定义的变量 num。又因为匿名箭头函数体返回后自加num,所以当函数 console.log() 调用函数 test() 时,打印 20,再自加 1,即 最终输出的结果为 20,num值为21。

标签:20,函数,箭头,num,test,return,表达式
From: https://www.cnblogs.com/longmo666/p/17833555.html

相关文章

  • 无涯教程-Dart - isEmpty函数
    如果字符串为空,则返回true;否则返回false。isEmpty-语法String.isEmptyisEmpty-示例voidmain(){Stringstr="Learnfk";print(str.isEmpty);}它将产生以下输出-。False参考链接https://www.learnfk.com/dart-programming/dart-programming-string-p......
  • 闭包函数:1.函数内部定义函数 2.内部函数使用了非它作用域的参数。
    执行以下程序,输出结果为()functionouter(){varnum=0;functioninner(){num++;console.log(num);}returninner;}varf1=outer();f1();f1();varf2=outer();f2();f2();A1234B111......
  • 无涯教程-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}");}它将产生以下输出-......
  • 常用的 Cron 表达式
    0010,14,16**?每天上午10点,下午2点、4点00/309-17**?朝九晚五工作时间内,每半小时0012?*WED表示每个星期三中午12点0012**?每天中午12点触发01510?**每天上午10:15触发01510**?每天上午10:15触发01510**?*每天上午......
  • 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=......