ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

揭秘 JavaScript 函数表达式

2021-09-23 14:34:25  阅读:147  来源: 互联网

标签:语句 counter 函数 JavaScript incrementCounterAndPrint 内存 执行 揭秘 表达式


 

 

  赋值给变量的函数称为函数表达式。如果您还没有阅读过 JavaScript 中的函数,我建议您在继续阅读之前先阅读本文。让我们试着借助一个例子来理解函数表达式。

var counter = 0
var incrementCounterAndPrint = function () {
  counter++;
  console.log("Incremented Counter", counter);
}
incrementCounterAndPrint()

  当 JS 引擎遇到这段代码时,首先它会创建一个全局执行上下文并启动创建阶段。在创建阶段,它会遍历所有的声明语句并将它们放入内存中。在这种情况下,变量`反`和` incrementCounterAndPrint `将被存储在具有缺省值内存,`undefined`分配给它。 

      由于没有更多的声明语句,它将进入第二阶段,即执行阶段。执行阶段是代码逐行执行的阶段。在这种情况下,首先,`计数器`将被分配到的值` 0 `和`incrementCounterAndPrint`将与作为值的整个功能被分配。当 JS 引擎遇到语句 ` incrementCounterAndPrint() ` 时,它会首先检查内存是否存在这个特定变量。由于它存在,它将从内存中获取值并执行它。在执行函数时,函数` incrementCounterAndPrint` 将被推送到调用堆栈并创建一个新的函数执行上下文。一旦创建了执行上下文,它将启动创建阶段。由于没有这样的声明语句,它将进入称为执行阶段的第二阶段。在这个阶段,首先 JS 引擎会执行语句 ` counter++ `。在执行时,它会检查变量是否存在于本地内存中,如果不存在,它将移动到全局执行上下文并检查它的内存。一旦找到变量,它就会执行操作并移动到下一行。在执行该语句`的console.log(“增加计数器”,计数器) `,它会打印出值' 1 '到控制台。

        现在,显而易见的问题是函数表达式是否被提升?好吧,让我们通过调整上面的代码来检查一下。

 var counter = 0
incrementCounterAndPrint() // TypeError: incrementCounterAndPrint 不是函数
var incrementCounterAndPrint = function () {
counter++;
控制台日志(“增量计数器”,计数器);
}

         当 JS 引擎运行上面的代码时,它会抛出一个类型错误。你能告诉我为什么会这样吗?好吧,如果我们尝试观察代码,我们可以看到该函数被赋值给变量 ` incrementCounterAndPrint`。在根据提升功能的创建阶段,所有变量声明都将移到顶部,而将分配给它的值留在后面。在这种情况下,` incrementCounterAndPrint ` 将被移动到顶部,留下函数代码,并且默认设置为一个值 ` undefined `,因为它是使用 ` var`声明的。当JS引擎遇到语句` incrementCounterAndPrint()` 将首先检查变量的内存。由于它存在,它将获取存储的值,即“未定义”。由于 undefined 不是 ` function`类型,它会抛出一个类型错误。这使我们得出结论,函数表达式没有被提升。函数表达式有其作用域。函数表达式通常是匿名的,但我们也可以给它命名,这对调试有很大帮助。

七爪网七爪网-专注于分销商城,小程序定制,网站开发,定制开发,成品源码的源码交易平台

   

 

标签:语句,counter,函数,JavaScript,incrementCounterAndPrint,内存,执行,揭秘,表达式
来源: https://www.cnblogs.com/zhiyan0112/p/15324047.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有