3.JS( 八 )

11.2 函数调用//f(); --->OKfunction f(){console.log("hello")}f() //----->OK不同于python,js代码在运行时,会分为两大部分———预编译 和 执行阶段 。

  • 预编译:会先检测代码的语法错误,进行变量、函数的声明 。
  • 执行阶段:变量的赋值、函数的调用等,都属于执行阶段 。
11.3 函数参数// 位置参数function add(a,b){    console.log(a);    console.log(b);}add(1,2)add(1,2,3)add(1)// 默认参数function stu_info(name,gender="male"){    console.log("姓名:"+name+" 性别:"+gender)}stu_info("yuan")11.4 函数返回值在函数体内,使用 return 语句可以设置函数的返回值 。一旦执行 return 语句,将停止函数的运行,并运算和返回 return 后面的表达式的值 。如果函数不包含 return 语句,则执行完函数体内每条语句后,返回 undefined 值 。
function add(x,y) {          return x+y      }var ret = add(2,5);console.log(ret)11.5 匿名函数匿名函数,即没有变量名的函数 。在实际开发中使用的频率非常高!也是学好JS的重点 。
// 匿名函数赋值变量var foo = function () {console.log("这是一个匿名函数!")};// 匿名函数的自执行(function (x,y) {console.log(x+y);})(2,3)// 匿名函数作为一个高阶函数使用function bar() {  return function () {      console.log("inner函数!")  }}bar()()11.6 函数作用域变量的作用域有全局作用域和局部作用域两种 。
// 局部变量,是在函数内部声明,它的生命周期在当前函数被调用的时候, 当函数调用完毕以后,则内存中自动销毁当前变量// 全局变量,是在函数外部声明,它的生命周期在当前文件中被声明以后就保存在内存中,直到当前文件执行完毕以后,才会被内存销毁掉11.7 JS预编译js运行三个阶段:
  1. 语法分析
  2. 预编译
  3. 解释执行
预编译可分为全局预编译和局部预编译 。
  1. 在js脚本加载之后,会先通篇检查是否存在低级错误;
  2. 在语法检测完之后,便进行全局预编译;
  3. 在全局预编译之后,就解释一行,执行一行;
  4. 当执行到函数调用那一行前一刻,会先进行函数预编译,再往下执行 。
全局预编译的3个步骤:
  1. 创建GO对象(Global Object)全局对象,即window对象 。
  2. 找变量声明,将变量名作为GO属性名,值为undefined
  3. 查找函数声明,作为GO属性,值赋予函数体
局部预编译的4个步骤:
  1. 创建AO对象(Activation Object)执行期上下文 。
  2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
  3. 将实参值和形参统一 。
  4. 在函数体里面找函数声明,值赋予函数体 。
GO对象是全局预编译,所以它优先于AO对象所创建和执行
局预编译     
GO/window = {         a: undefined,         c: undefined,         foo: function(a) {             console.log(a);             var a = 123;             console.log(a);             function a() {}             console.log(a);             var b = function() {}             console.log(b);             function d() {}         }     }

经验总结扩展阅读