[JavaScript基础] 递归,预编译

2018-11-13  本文已影响0人  Darkdreams

递归

  1. 找规律
  2. 找出口,如果没有出口,就是死循环。
    函数自调用
// 阶乘
// n! = n * (n - 1)!
function num(n) {
  if(n == 1 || n == 0) {
    return 1
  }
  return n * num(n - 1)
}
num(10)  // 3628800

//斐波那契额数列
// fb(n) == fb(n - 1) + fb(n - 2)
function fb(n) {
  if(n == 1 || n == 2) {
    return 1
  }
  return fb(n - 1) + fb(n - 2)
}
fb(10) // 55

预编译

JavaScript,是单线程,解释性语言。

语法分析

浏览器会通篇扫描,检查代码有没有低级错误,比如使用了中文符号等。但不执行代码

  1. 函数声明整体提升,不管函数声明写到哪里,浏览器都会提升到最前面。
test();  //-可执行
function test() {
  console.log("被提升了")
}
  1. 变量 声明提升
//var a;
console.log(a); // undefined
// a = 123
var a = 123;
console.log(a); // 123

预编译前奏
  1. imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象window所有。
var a = 1;
b = 2; //- window.b = 2
//
function demo() {
  var a = b = 123;   
  /*
    先赋值123给b,再声明a,把b的赋值给a。
    a是局部变量,而b未经声明是个全局变量。
  */
}
demo();
console.log(a);
console.log(b);
  1. 全局上所有声明的变量(函数),全是window的属性。
var a = 1;
/* window {    //a就是window的属性
    a : 1
  }
*/

函数预编译过程(四步骤)
  1. 创建OA对象Activation Object(执行期上下文);
  2. 找形参和变量声明,将形参和变量名作为AO的属性名;
  3. 实参和形参值相统一;
  4. 在函数体中找到函数声明(函数声明优先级最高)

全局预编译过程
  1. 创建GO对象Global Objectwindow === GO
  2. 找形参和变量声明,将形参和变量名作为GO的属性名;
  3. 在函数体中找到函数声明(函数声明优先级最高)

解释执行
上一篇 下一篇

猜你喜欢

热点阅读