深入理解JavaScript系列(15)函数

函数有三种类型:函数声明、函数表达式、函数构造器函数。

函数声明

函数声明缩写FD:

有一个特定的名称; 在源码中的位置:要么处于程序级,要么处于函数主体中; 进入上下文阶段创建; 影响变量对象;

function foo () {

};

注:不可能在表达式位置或一个代码块中定义。

函数表达式

函数表达式缩写FE:

远吗必须出现在表达式位置; 有可选的名称; 不会影响变量对象; 在代码执行阶段创建;

var foo = function () {

};

上述代码是让一个匿名函数表达式赋值给变量foo,可以通过foo这个名称进行访问。

var foo = function _foo () {

};

上述函数使用可选的名称foo;函数外部通过foo访问,内部使用foo访问。

函数表达式不能以大括号和函数关键字(function)开始。以下为错误:

function foo () {}();

function foo (){}为表达式,不能被调用。但是表达式加一个分组操作符则正确。下面代码最后的(1)则为分组操作符。

function foo (){}(1);

逗号、或与非都会使函数声明变为表达式:

1,function () {
}
!function () {
}

函数表达式不影响变量,比如:

var foo = _foo (){}; //_foo这个变量全局则访问不到

通过函数构造器创建的函数

构造函数的[[scope]]仅包含全局对象

var x = 10;
funtion foo () {
    var x = 20, y = 30;
    var bar = new Function ('console.log(x, y)');
    bar(); // 10, y未定义
}

Function构造器 可以使用new,也可以不使用。

Written on July 5, 2015