图解 Google V8
李兵
前盛大创新院高级研究员
26763 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
图解 Google V8
15
15
1.0x
00:00/00:00
登录|注册

02 | 函数即对象:一篇文章彻底搞懂JavaScript的函数特点

基于原型链继承
可以动态修改内容
函数类型
对象类型
原始类型
由一组属性和值组成的集合
外部变量和函数绑定
函数作为一等公民的特性
可以被调用
可以拥有属性和值
函数是一种特殊的对象
可以作为返回值
可以作为参数传递
可以赋值给变量
实现继承的方式
不是面向对象的语言
基于对象的语言
对象的灵活性
对象的值类型
对象的定义
闭包
函数的本质
函数是一等公民
JavaScript中的面向对象
JavaScript中的对象
JavaScript中的函数特点

该思维导图由 AI 生成,仅供参考

你好,我是李兵。这是我们专栏的第二讲,我们来看下“函数是一等公民”背后的含义。
如果你熟悉了一门其他流行语言,再来使用 JavaScript,那么 JavaScript 中的函数可能会给你造成一些误解,比如在 JavaScript 中,你可以将一个函数赋值给一个变量,还可以将函数作为一个参数传递给另外一个函数,甚至可以使得一个函数返回另外一个函数,这在一些主流语言中都很难实现。
JavaScript 中的函数非常灵活,其根本原因在于 JavaScript 中的函数就是一种特殊的对象,我们把 JavaScript 中的函数称为一等公民 (First Class Function)。
基于函数是一等公民的设计,使得 JavaScript 非常容易实现一些特性,比如闭包,还有函数式编程等,而其他语言要实现这些特性就显得比较困难,比如要在 C++ 中实现闭包需要实现大量复杂的代码,而且使用起来也异常复杂。
函数式编程和闭包在实际的项目中会经常遇到,如果不了解这些特性,那么在你使用第三方代码时就会非常吃力,同时自己也很难使用这些特性写出优雅的代码,因此我们很有必要了解这些特性的底层机制。
另外,在我们后续课程介绍 V8 工作机制时,会学习 V8 是怎么实现闭包的,还会学习 V8 是如何将 JavaScript 的动态特性静态化以加快代码的执行速度,这些内容都涉及到 JavaScript 中的函数底层特性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript中的函数是一等公民,具有特殊的对象属性,可以赋值给变量、作为参数传递给其他函数,甚至作为另一个函数的返回值。这种特性使得JavaScript非常灵活,容易实现闭包和函数式编程等特性。文章深入分析了JavaScript中的对象和函数的本质,指出JavaScript中的对象是由一组属性和值构成的集合,而函数除了拥有常用类型的属性值外,还拥有两个隐藏属性,分别是name属性和code属性。由于函数是一种特殊的对象,支持函数是一等公民的语言可以使得代码逻辑更加清晰,代码更加简洁。然而,由于函数的“可被调用”的特性,使得实现函数的可赋值、可传参和可作为返回值等特性变得有一点麻烦。文章还介绍了闭包的概念,即将外部变量和函数绑定起来的技术,以及V8在实现闭包特性时所做的工作。总的来说,本文通过深入分析JavaScript中函数的特性,帮助读者更好地理解JavaScript中函数的概念和底层机制。 JavaScript中的函数是一等公民,具有特殊的对象属性,可以赋值给变量、作为参数传递给其他函数,甚至作为另一个函数的返回值。这种特性使得JavaScript非常灵活,容易实现闭包和函数式编程等特性。文章深入分析了JavaScript中的对象和函数的本质,指出JavaScript中的对象是由一组属性和值构成的集合,而函数除了拥有常用类型的属性值外,还拥有两个隐藏属性,分别是name属性和code属性。由于函数是一种特殊的对象,支持函数是一等公民的语言可以使得代码逻辑更加清晰,代码更加简洁。然而,由于函数的“可被调用”的特性,使得实现函数的可赋值、可传参和可作为返回值等特性变得有一点麻烦。文章还介绍了闭包的概念,即将外部变量和函数绑定起来的技术,以及V8在实现闭包特性时所做的工作。总的来说,本文通过深入分析JavaScript中函数的特性,帮助读者更好地理解JavaScript中函数的概念和底层机制。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《图解 Google V8》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(56)

  • 最新
  • 精选
  • pedro
    基本上近些年出现的编程语言,函数都是一等公民,比如谷歌强推的kotlin和go,大数据语言scala,还有rust,当然还有老牌的经典函数语言Haskell等等。顺带问一下,老师的画图很好看,请问是什么软件画的😃

    作者回复: mac上的kenote,我们编辑MM画的

    2020-03-16
    2
    32
  • 旺旺
    如果在函数对象上再用代码foo.name="aaaa",这会覆盖函数的名称吗?

    作者回复: 不会的,编译规程中已经生成函数对象了,对应的作用域中也保存了指向对象的引用了,所以对象本身的name属性改变是不会影响到函数正常的执行的

    2020-04-04
    6
    21
  • 我爱学习
    请问文中的原始值是指规范中 “primitive value” 吗?如果是,我有以下疑问: 首先,在规范中 “primitive value” 的定义如下: “4.3.2 primitive value member of one of the types Undefined, Null, Boolean, Number, BigInt, Symbol, or String” 上述并没有包含文中提到的 object,或者是 object 作为原始值应该如何理解?然后原始值和基本数据类型的值有什么区别?

    作者回复: 这个我写错了,Object是对象类型,不是原始类型,我改过来了。

    2020-03-16
    13
  • oillie
    在函数内使用了某个变量,却没有在这个函数中声明,这种变量叫free variable,比如上面的number变量

    作者回复: 补充的真好,

    2020-03-28
    2
    9
  • 杨越
    小米面试题: 1.闭包 2.作用域链 3.原型链 4.两个链之间的区别

    作者回复: 常用的一些面试题,学完本专栏,会从根本上理解这些题目

    2020-03-16
    3
    9
  • Gray
    在js中,函数是一种特殊的对象,理解了这一点,今天我就没白学

    作者回复: 对,理解这一点非常重要,后很多概念都需要这个基础

    2020-03-16
    7
  • 可可
    第一次,简单和清晰明白了JavaScript中的闭包和一个函数在那些方面是一个特殊的对象,👍。 解释的果然深入浅出。 另一个函数是一等公民的,知道的有Python

    作者回复: 赞

    2020-03-16
    2
    7
  • 法正
    老师,是不是可以这样说,正是因为函数在JS中是一等公民,所以才有了闭包。闭包的出现就是为了实现函数可以赋值给一个变量、也可以作为函数的参数、还可以作为函数的返回值这些特性。

    作者回复: 对,闭包还能实现变量的封装

    2020-06-12
    2
    6
  • 我来人间一趟
    有个问题想请教下老师,生成ast语法树是一次性将所有代码都结构化成ast吗 还是部分结构化呀

    作者回复: 部分啊,后面惰性解析会讲

    2020-04-29
    5
  • 芳华年月
    老师,code属性打印不出来,code属性可以查看吗

    作者回复: 这个是v8提供的内部属性,没有提供js接口

    2020-04-11
    5
收起评论
显示
设置
留言
56
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部