美文网首页
07 | 读JavaScript 高程

07 | 读JavaScript 高程

作者: cemcoe | 来源:发表于2020-06-03 21:53 被阅读0次

这是第七章函数表达式,这一章涉及函数预编译,闭包,作用域链内容。函数涉及内容繁多。

前情提要 02-1 | 读JavaScript 高程 | 解释,这章的重点其实在函数预编译时发生事情。

我们知道对象是属性和方法的合集。而我们的函数其实也是对象,所以对象上的一些东西,或者说原型链上的方法是可以使用的。

通过实验来了解一些这波知识。

那么问题来了,第一步如何逮到实验要用的小白鼠。


1.函数的创建方式有哪些?

实验小白鼠通过培养或者去逮一下,那么我们的实验用品函数如何培养出来?
目前来讲有以下几种方案:

  • 函数声明
  • 函数表达式
  • 匿名函数
  • 箭头函数
  • 函数生成器

这里的点在于ES6中新增的箭头函数和ES7新增的函数生成器。

2.函数有什么方法?

函数是对象,它有 name 和 length 方法。

[(function a(){}).name, (function b(c, d){}).length]
// ["a", 2]

name 代表函数名,length 代表函数形参的数量。

3.函数运行

  • 加()
  • call apply

站在编写代码的角度,函数的使用分两步,定义和运行,下面站在浏览器或者说编译器的角度来看一看。

4.js运行三步曲

  • 词法分析
  • 预编译
  • 解释执行

词法分析,通篇扫描,看看有没有语法错误。

进入紧张刺激的预编译环节。

sayHi()
function sayHi() {
  console.log('hi')
}
sayHi()

甭管是在函数声明前调用还是在函数声明后调用,都能得到结果,这是为什么?

换一种函数定义方式,为什么会报错误?

a()
var a = function () {
  console.log('hi')
}
a()
// a()
// ^

// TypeError: a is not a function

未定义前 a 是个什么玩意?

console.log(a)
var a = function () {
  console.log('hi')
}
a()
// undefined
// hi

上面这些状况是在预编译时引发的,那么在预编译时,函数受到了怎样的待遇?这是怎样的一套规则?

5.预编译的过程(全文背诵)

预编译发生在函数执行的前一刻。

imply global:全局对象所有:全局变量,未经声明就赋值的变量。

来个例子:

function fn(a) {
  console.log(a)
  var a = 123
  console.log(a)
  function a () {}
  console.log(a)
  var b = function () {}
  console.log(b)
  function d() {}
}
fn(1)

预编译的过程:

  1. 创建AO对象,Activation Object 执行期上下文。

  2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined。

3.将实参和形参相统一。

4.在函数体里找函数声明,值赋予函数体。

// 按照上面步骤走两步
1.
AO {

}
2.
AO {
  a:undefined,
  b:undefined
}
3. 
AO {
  a:1,
  b:undefined
}
4.
AO {
  a:function a() {},
  b:undefined,
  d:function d() {}
}

解释执行时用到的AO:

AO {
  a:function a() {},
  b:undefined,
  d:function d() {}
}
function fn(a) {
  console.log(a) // function
  var a = 123
  console.log(a) // 123
  function a () {}
  console.log(a) // 123
  var b = function () {}
  console.log(b) // function
  function d() {}
}
fn(1)

题目:

console.log(a)
var a = 123
// undefined
console.log(a)
function a(a) {
  var a = 1997
  var a = function () {}
  a()
}
var a = 2020

相关文章

  • 07 | 读JavaScript 高程

    这是第七章函数表达式,这一章涉及函数预编译,闭包,作用域链内容。函数涉及内容繁多。 前情提要 02-1 | 读Ja...

  • 07-1 | 读JavaScript 高程

    这是第七章函数表达式,这一章涉及函数预编译,闭包,作用域链内容。函数涉及内容繁多。今天来看作用域链。 在 06-2...

  • 05 | 读JavaScript 高程

    这是第五章引用类型,这一章涉及引用类型的种类,各个类型身上的方法等相关内容。 主要知识点: 1.引用类型和类和对象...

  • 01 | 读 JavaScript 高程

    缘起 总感觉自己前端的知识体系不是很系统,打算读一下这本很多人推荐的书,从目录来看第三版有些东西在2020年可能已...

  • 02 | 读 JavaScript 高程

    今天来瞧一瞧第二章在 HTML中使用 JavaScript script 标签属性的变化 首先是 script 标...

  • 03 | 读JavaScript 高程

    这是第三章基本概念,这一章涉及变量,操作符,语句和函数等相关内容。 主要的知识点: ECMAScript 中究竟有...

  • 06 | 读JavaScript 高程

    这是第六章面向对象的程序设计,这一章涉及到一些概念和思想,也是 JavaScript 中很重要的知识点。需要注意的...

  • 04 | 读JavaScript 高程

    这是第四章基本概念,这一章涉及变量、作用域和内存问题等相关内容。主要知识点: 值类型和引用类型的区别是什么? 如何...

  • 08 | 读JavaScript 高程

    这一篇呢是第8章,主要涉及 BOM 的相关知识。 先来看BOM,即和浏览器相关地一些东西。 知识点:1.BOM 中...

  • 13 | 读JavaScript 高程 | 事件

    这一篇呢是第13章,内容是和事件相关。 事件可以看成是条件判断的一种条件,逻辑是某个元素发生了某个事情,我要做出相...

网友评论

      本文标题:07 | 读JavaScript 高程

      本文链接:https://www.haomeiwen.com/subject/jeppzhtx.html