图解 Google V8
李兵
前盛大创新院高级研究员
立即订阅
2531 人已学习
课程目录
已更新 7 讲 / 共 24 讲
0/4登录后,你可以任选4讲全文学习。
宏观视角 (2讲)
开篇词 | 如何学习谷歌高性能 JavaScript 引擎V8?
免费
01 | V8是如何执行一段JavaScript代码的?
JavaScript设计思想篇 (5讲)
02 | 函数即对象:一篇文章彻底搞懂JavaScript的函数特点
03|快属性和慢属性:V8采用了哪些策略提升了对象属性的访问速度?
04 | 函数表达式:涉及大量概念,函数表达式到底该怎么学?
05|原型链: V8是如何实现对象继承的?
06|作用域链:V8是如何查找变量的?
图解 Google V8
登录|注册

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

李兵 2020-03-16
你好,我是李兵。这是我们专栏的第二讲,我们来看下“函数是一等公民”背后的含义。
如果你熟悉了一门其他流行语言,再来使用 JavaScript,那么 JavaScript 中的函数可能会给你造成一些误解,比如在 JavaScript 中,你可以将一个函数赋值给一个变量,还可以将函数作为一个参数传递给另外一个函数,甚至可以使得一个函数返回另外一个函数,这在一些主流语言中都很难实现。
JavaScript 中的函数非常灵活,其根本原因在于 JavaScript 中的函数就是一种特殊的对象,我们把 JavaScript 中的函数称为一等公民 (First Class Function)。
基于函数是一等公民的设计,使得 JavaScript 非常容易实现一些特性,比如闭包,还有函数式编程等,而其他语言要实现这些特性就显得比较困难,比如要在 C++ 中实现闭包需要实现大量复杂的代码,而且使用起来也异常复杂。
函数式编程和闭包在实际的项目中会经常遇到,如果不了解这些特性,那么在你使用第三方代码时就会非常吃力,同时自己也很难使用这些特性写出优雅的代码,因此我们很有必要了解这些特性的底层机制。
另外,在我们后续课程介绍 V8 工作机制时,会学习 V8 是怎么实现闭包的,还会学习 V8 是如何将 JavaScript 的动态特性静态化以加快代码的执行速度,这些内容都涉及到 JavaScript 中的函数底层特性。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《图解 Google V8》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(22)

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

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

    2020-03-16
    11
  • 我爱学习
    请问文中的原始值是指规范中 “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
    3
  • 杨越
    小米面试题:
    1.闭包
    2.作用域链
    3.原型链
    4.两个链之间的区别

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

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

    另一个函数是一等公民的,知道的有Python

    作者回复: 赞

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

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

    2020-03-16
    2
  • oillie
    在函数内使用了某个变量,却没有在这个函数中声明,这种变量叫free variable,比如上面的number变量
    2020-03-28
  • 刘大夫
    JS 是一门基于对象的语言,可以说 JS 中的绝大部分内容都是由对象构成的,而这里的对象只是一组组键值对组成的集合。JS 的继承有别于传统经典的面向对象语言,它是通过原型链的方式实现的。函数是一种特殊的对象,其特殊性体现在拥有属性和值之外,还可以被调用。这是因为每个函数 V8 内部都添加了 name 和 code 两个属性。在 JS 中函数是一等公民,可以很容易的实现闭包。
    2020-03-24
  • 好名字
    ”JavaScript 中实现继承的方式却非常简单清爽,只是在对象中添加了一个称为原型的属性,把继承的对象通过原型链接起来,就实现了继承,我们把这种继承方式称为基于原型链继承“,这句话把JavaScript的原型机制一句话讲的透透的。也彻底跟面向对象的语言区别开了。
    2020-03-23
  • pcxpccccx_
    言简意赅,看的会上瘾
    2020-03-22
  • 如果某个编程语言的函数可以和它的数据类型做一样的事情,我们就把这个语言中的函数称为一等公民——作为方法的参数,作为方法的返回值,作为变量的值。
    2020-03-22
  • gek_zou
    深入浅出,看完就明白了,期待接下来的更新
    2020-03-19
  • 我觉得只要是脚本语言,如python,php都会有这个特性吧?因为这些脚本语言的一个相同点都是变量使用特别灵活,并且都是面向过程或函数式编程~
    2020-03-19
  • 龙哥
    LISP和PHP应该算
    2020-03-18
  • 鬼谷子xl
    为什么我在google里.code没有拿到任何东西啊

    作者回复: 这个属性并没有开放给JavaScript,V8内部处理的

    2020-03-18
    1
  • 杨越
    function f1() {
            this.name = 123
        }
        console.log(f1.name)
        console.log(f1.code)
    name有值,是f1;但是code是undefined怎么回事呢老师
    2020-03-18
    3
  • -_-|||
    "函数除了可以拥有常用类型的属性值之外,还拥有两个隐藏属性,分别是 name 属性和 code 属性。"在浏览器试了下有name属性,但没有code属性。

    作者回复: 这个浏览器下看不到的,内部使用的

    2020-03-18
  • 我扫你还是你扫我
    js函数内声明函数,即使外部函数超出作用域,如果他的变量被内部函数引用,那么这个变量也不能被回收释放和销毁,这就是闭包,请神容易送神难。
    2020-03-18
  • 潇潇雨歇
    期待闭包的v8底层讲解
    2020-03-17
  • 伪装
    不带一些v8源码吗

    作者回复: 这个专栏不讲源码的

    2020-03-17
  • -_-|||
    画得图特别卡哇伊

    作者回复: 我们编辑MM画的

    2020-03-17
收起评论
22
返回
顶部