前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >函数类型_C语言函数类型

函数类型_C语言函数类型

作者头像
全栈程序员站长
发布于 2022-09-20 07:20:17
发布于 2022-09-20 07:20:17
99800
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

函数类型

在ECMAScript 中有三种函数类型:函数声明,函数表达式和函数构造器创建的函数。每一种都有自己的特点。

1.函数声明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//函数声明(缩写为FD)是这样一种函数:
//1.有一个特定的名称
//2.在源码中的位置:要么处于程序级(Program level),要么处于其它函数的主体(FunctionBody)中
//3.在进入上下文阶段创建
//4.影响变量对象
//5.以下面的方式声明


function exampleFunc() {}

这种函数类型的主要特点在于它们仅仅影响变量对象。该特点也解释了第二个重要点(它是变量对象特性的结果)在代码执行阶段它们已经可用(因为FD在进入上下文阶段已经存在于VO中——代码执行之前)。

例如(函数在其声明之前被调用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo();
 
function foo() {
  alert('foo');
}

第二点函数声明在源码中的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 函数可以在如下地方声明:
// 1) 直接在全局上下文中
function globalFD() {
  // 2) 或者在一个函数的函数体内
  function innerFD() {}
}

2.函数表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//函数表达式(缩写为FE)是这样一种函数:
//在源码中须出现在表达式的位置
//有可选的名称
//不会影响变量对象
//在代码执行阶段创建

这种函数类型的主要特点在于它在源码中总是处在表达式的位置。最简单的一个例子就是一个赋值声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var foo = function foos() {
  ...
};

在外部FE通过变量“foo”来访问foo(),而在函数内部,有可能使用名称“foos”。

如果FE有一个名称,就很难与FD区分。但是,如果你明白定义,区分起来就简单明了:FE总是处在表达式的位置。在下面的例子中我们可以看到各种ECMAScript 表达式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 圆括号(分组操作符)内只能是表达式
(function foo() {});
 
// 在数组初始化器内只能是表达式
[function bar() {}];
 
// 逗号也只能操作表达式
1, function baz() {};

表达式定义里说明:FE只能在代码执行阶段创建而且不存在于变量对象中,示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// FE在定义阶段之前不可用(因为它是在代码执行阶段创建)
 
alert(foo); // "foo" 未定义
 
(function foo() {});
 
// 定义阶段之后也不可用,因为他不在变量对象VO中
 
alert(foo);  // "foo" 未定义

在表达式中使用它们,”不会污染”变量对象。最简单的例子是将一个函数作为参数传递给其它函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function foo(callback) {
  callback();
}
 
foo(function bar() {
  alert('foo.bar');
});
 
foo(function baz() {
  alert('foo.baz');
});

3.通过函数构造器创建的函数

这种函数的[[Scope]]属性仅包含全局对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     var x = 10;

        function foo() {

            var x = 20;
            var y = 30;

            var bar = new Function('alert(x); alert(y);');

            bar(); // x:10, y:未定义

        }
        foo()

函数bar的[[Scope]]属性不包含foo上下文的Ao的变量y不能访问,变量x从全局对象中取得。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/167167.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ECMA-262-3 详解:5、函数
从来没有深入了解ECMA,网上找了一下,发现早在2010年就有大佬 Dmitry Soshnikov[1] 总结了ECMA中的核心内容,我这里只是翻译记录,加深自己的印象。文章原文来自ECMA-262-3 in detail. Chapter 5. Functions.[2]
踏浪
2020/07/08
7490
ECMA-262-3 详解:2、变量对象
从来没有深入了解ECMA,网上找了一下,发现早在2010年就有大佬 Dmitry Soshnikov 总结了ECMA中的核心内容,我这里只是翻译记录,加深自己的印象。文章原文来自 ECMA-262-3 in detail. Chapter 2. Variable object.
踏浪
2020/06/22
6450
深入理解JavaScript之变量对象(Variable Object)
英文 | http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/
前端达人
2021/04/01
4290
JS学习系列 06 - 变量对象
上一节我们讨论了执行上下文,那么在上下文中到底有什么内容,为什么它会和作用域链扯上关系,JS 解释器又是怎么找到我们声明的函数和变量,看完这一节,相信大家就不会再迷惑了。
leocoder
2024/02/01
960
JS学习系列 06 - 变量对象
JS学习系列 06 - 变量对象
上一节我们讨论了执行上下文,那么在上下文中到底有什么内容,为什么它会和作用域链扯上关系,JS 解释器又是怎么找到我们声明的函数和变量,看完这一节,相信大家就不会再迷惑了。
leocoder
2018/10/31
1.3K0
求职 | 听说集齐了这些Js题,笔试都不怕了呢!
1写在前面 一套JavaScript题目 前端工程师是互联网时代软件产品研发中不可缺少的一种专业研发角色。以前看过一套JavaScript题目,借花献佛拿出来分享一下,附带了自己的理解和答案。有争议的地方,欢迎大家指出和讨论。 下面可以前端笔试中的典型“坑”呢,快来看看吧! (左右滑动查看代码) 2题目详情 2.1   题目一 (function()  {        return typeof arguments;        }        ) (); 答案:“object” argum
用户1097444
2022/06/29
2450
求职 | 听说集齐了这些Js题,笔试都不怕了呢!
ECMA-262-3 详解:4、作用域链
从来没有深入了解ECMA,网上找了一下,发现早在2010年就有大佬 Dmitry Soshnikov 总结了ECMA中的核心内容,我这里只是翻译记录,加深自己的印象。文章原文来自ECMA-262-3 in detail. Chapter 4. Scope chain.
踏浪
2020/07/03
4760
JavaScript 作用域和作用域链
作用域就是变量与函数的可访问范围。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
零式的天空
2022/03/02
1.7K0
深入理解变量对象、作用域链和闭包
执行上下文、执行栈、作用域链、闭包,这其实是一整套相关的东西,之前转载的文章也有讲到这些。下面两篇文章会更加详细地解释这些概念。
Chor
2019/11/07
7370
《你不知道的JavaScript》 (上) 阅读摘要
本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅;
前端下午茶
2019/06/27
5460
javascript中函数声明和函数表达式浅析
记得在面试腾讯实习生的时候,面试官问了我这样一道问题。 //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){};  当初只知道两种声明方式一个是函数声明一个是函数表达式,具体有什么不同没能说得很好。最近正好看到这方面的书籍,就想好好总结一番。 在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明。对此,ECMAScript规范明确了一点,即是,即函数声明 必须始终带有一个标识符(Identifier)
Sb_Coco
2018/05/28
9402
用匿名函数定义函数_c语言最先执行的函数是
关于函数声明,它最重要的一个特征就是函数声明提升,意思是执行代码之前先读取函数声明。这意味着可以把函数声明放在调用它的语句之后。如下代码可以正确执行:
全栈程序员站长
2022/08/04
1K0
一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域
它的一个重要特点就是:函数声明提升,就是在执行代码前先读取函数声明,可以把函数声明放在调用它的语句后。
达达前端
2020/01/02
5840
JavaScript 模式》读书笔记(4)— 函数1
  从这篇开始,我们会用很长的章节来讨论函数,这个JavaScript中最重要,也是最基本的技能。本章中,我们会区分函数表达式与函数声明,并且还会学习到局部作用域和变量声明提升的工作原理。以及大量对API、代码初始化、程序性能等有帮助的模式。
zaking
2020/03/26
3970
JS到底是怎么执行的:一文彻底搞清执行上下文
所有JavaScript代码都需要在某种环境中托管和运行。在大多数情况下,这种环境是一个web浏览器。
前端修罗场
2022/07/29
1.5K0
JS到底是怎么执行的:一文彻底搞清执行上下文
【深度剖析】JavaScript中块级作用域与函数作用域
沉浸式趣谈
2024/03/13
2970
【深度剖析】JavaScript中块级作用域与函数作用域
JavaScript——执行环境、变量对象、作用域链
这几天在看《javascript高级程序设计》,看到执行环境和作用域链的时候,就有些模糊了。书中还是讲的不够具体。通过上网查资料,特来总结,以备回顾和修正。
喝茶去
2019/04/16
7870
你不知道的javaScript笔记(1)
规避冲突 function foo(){ function bar(a){ i = 3; console.log(a + i); } for ( var i=0; i < 10; i++){ bar(i * 2) } }   // 11无限死循环 区分函数声明和函数表达式最简单的方法是看 function 关键字出现的位置,如果function是声明中的第一个词,那么是函数声明,否则是函数表达式。 (function foo(){})() 立即执行的函数表达式 IIFE 立即执行函数表
用户1197315
2018/01/22
6650
Immediately-Invoked Function Expression (IIFE)即调函数表达式
以防你没有注意到,我先声明下:我总是要求术语。所以,在听到许多次 流行的,但是让人误解的 JavaScript术语“self-executing anonymous function自我执行匿名函数(或者self-invoked anonymous function自我调用匿名函数)”之后,最终我决定把我的想法组织成一篇文章。 除了提供一些关于IIFE这个模式的非常详细的信息,我也在‘我们该如何称呼它’上 做了建议。此外,如果你想跳到前面,你可以只查看下面的Immediately-Invoked Function Expressions部分,但是我建议读完整篇文章。 这篇文章不是想表达“我是对的,你是错的”,这类的事情。我是真的对“帮助其他人理解潜在地复杂概念”感兴趣,并且觉得“使用一致和准确的术语是人们可以做的促进理解 最简单的事情”。
lesM10
2019/08/26
7920
函数与作用域
1.函数声明和函数表达式有什么区别 函数就是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 JavaScript有三种方法,可以声明一个函数。 1.function命令 function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面传入函数的参数。函数体放在大括号里面。 function add(s) { console.log(s) } 上面的代码命名了一个print函数,以后使用print()这种形式,就可以调用相应
小胖
2018/06/27
8460
推荐阅读
相关推荐
ECMA-262-3 详解:5、函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文