一、函数声明和函数表达式有什么区别
首先先来看一下什么叫函数声明和函数表达式

上面得到的结果是 fn1 运行成功, fn2 是undefined,那么,我们现在来分析一下为什么。JS 引擎在解释 JS 语句的时候,会先把变量声明和函数声明前置。变量声明前置是先定义变量,而函数声明前置是把整个函数提升到最前,而函数表达式和变量声明没区别。
二、什么是变量的声明前置?什么是函数的声明前置
JS 引擎在解释 JS 语句的时候,会先把变量声明和函数声明前置。变量声明前置是先定义变量,而函数声明前置是把整个函数提升到最前,而函数表达式和变量声明没区别。举个例子:

三、arguments 是什么
arguments是 JS 中的一个内置对象,是所有函数中可用的局部变量,里面存放着所有传进函数的参数,第一个参数键值是 "0" ,第二个是 "1" · · · 同时该对象还有length键值,所以这是一个类数组对象。直接上例子:

test 函数输出结果
所有传进来的参数均可从这里访问,这样可以让函数处理指定一些不固定参数数量的情况,或者实现重载。
参考:arguments | MDN
四、函数的"重载"怎样实现
重载就是:函数的方法名一样,而参数表不同的函数。打个比方,在 Java 中,方法名称相同,但参数顺序、名字、类型不同,编辑器就会认为这是两个不同的方法,可以同时存在。而 JS 中,相同名称的函数会被覆盖,因为 JS 函数虽然叫函数但本质还是对象,同一个对象不会共存。那在 JS 中如何实现?
既然重载是根据参数的不同,有不同的方法,那么刚好,JS 里面就有一个内置对象叫arguments,我们可以用这个来判断一下当前所有参数的长度、类型等,做出不同的效果。
五、立即执行函数表达式是什么?有什么作用
- 什么是立即执行函数?
立即执行函数(IIFE - Immediately Invoked Function Expressions)就是声明一个匿名函数,然后马上执行,通常写法是:
(function(){/* code /})()(function(){/ code */}())
还有更多其他写法,但都差不多,可以自行查找
- 有什么作用?
开辟独立的作用域,避免变量污染。
六、求 n!,用递归来实现

七、以下代码输出什么?
题目

八、写一个函数,返回参数的平方和?

九、如下代码的输出?为什么
题目

十、如下代码输出什么? 写出作用域链查找过程伪代码
题目
var x = 10;
bar()
function bar(){ var x = 30;
function foo(){ console.log(x) } foo();}
结果

参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions
http://www.jianshu.com/p/175fffba2296