前言

昨天经历了一次拉锯战一般的面试,被询问了很多javascript基础问题。发现很多概念有点遗忘,是时候在回归一遍书本、回归定义了。

复习的第一站还是从高程开始。基本阅读方法是从ES标准开始,从后往前,BOM和DOM高级技巧部分从前往后。

第7章 函数表达式

函数声明提升(function declaration hoisting),明显不同于C++的语法特性,js执行代码之前会先读取函数声明,因此声明可以写在调用语句之后。

不应该出现相同的函数名,否则函数声明提升时会出错,浏览器只会返回一个声明。

匿名函数/lambda函数,funciton关键字后没有标识符,因此也不会触发函数声明提升,如:

var func = function (args) {
  // todo
}

arguments.callee是一个指向正在执行的函数的指针,在递归中使用,可以避免函数被转存为匿名副本(通常令函数名=null会导致这个问题)后调用函数名出错的情况。

闭包是指能访问另一个函数作用域中变量的函数。

创建一个闭包可以制造一个空的作用域链,使闭包内部函数不会调用闭包外部的变量名。

匿名函数的内存分配:如 var refer = function() {return 1} refer是对匿名函数的引用,如果只需要返回值1,转存1后可以 refer = null 释放匿名函数。

闭包的内存泄漏:如 function f() {return function() { //do sth }} f()返回了一个匿名函数,匿名函数会包含f()的活动对象,因此闭包会占用更多内存。

函数参数是按值传递的,但传入引用类型是传递对象的指针值。

闭包的内存优化:函数表达式的写法如 (function() {})() +function() {}() 不被视作函数声明,最后的()代表直接执行函数,因此执行一次之后就销毁了函数作用域链占用的内存。