Function
函数包含一组语句,它们是JavaScript的基础模块单元,用于代码的复用、信息隐藏和组合调用。函数用于指定对象的行为。一般来说,所谓编程,就是将一组需求分解成函数与数据结构的技能。
JavaScript中函数被作为“一等公民”,函数也属于对象,不同的是只有函数可以被调用。
函数声明与表达式
函数声明
function foo() {
}
上面的方法会在执行前被 解析(hoisted),因此它存在于当前上下文的任意一个地方, 即使在函数定义体的上面被调用也是对的。
foo(); // 正常运行,因为foo在代码运行前已经被创建
function foo() {
}
函数赋值表达式
var foo = function() {
};
这个例子把一个匿名的函数赋值给变量 foo。
foo; // 'undefined'
foo(); // 出错:TypeError
var foo = function() {
};
由于 var 定义了一个声明语句,对变量 foo 的解析是在代码运行之前,因此 foo 变量在代码运行时已经被定义过了。
但是由于赋值语句只在运行时执行,因此在相应代码执行之前, foo 的值缺省为 undefined。
命名函数的赋值表达式
另外一个特殊的情况是将命名函数赋值给一个变量。
var foo = function bar() {
bar(); // 正常运行
}
bar(); // 出错:ReferenceError
bar 函数声明外是不可见的,这是因为我们已经把函数赋值给了 foo; 然而在 bar 内部依然可见。这是由于 JavaScript 的 命名处理 所致, 函数名在函数内总是可见的。[注意]:在IE8及IE8以下版本浏览器bar在外部也是可见的,是因为浏览器对命名函数赋值表达式进行了错误的解析, 解析成两个函数 foo 和 bar.
函数的调用
调用一个函数会暂停当前函数的执行,传递控制权和参数给新的函数。除了声明时定义的形式参数外,还传递两个隐式的参数:this和arguments.this的值取决于调用模式(方法调用,函数调用,构造函数调用,apply调用)。当实际参数和形式参数不匹配时不会报错,如果实际参数大于形式参数,多的值会忽略。如果实际参数小于形式参数,多的形式参数会设undefine.
方法调用
var Obj = {
value: 0,
increment: function(inc){
this.value += typeof inc === "number" ? inc : 1;
}
};
Obj.increment(); // 1
Obj.increment(2); //3
方法可以使用this访问自己所属的对象,所以它能从对象中取值和对对象进行修改,this到对象的绑定发生在调用的时候。
函数调用
//给Obj加一个double方法
Obj.double = function(){
var add = function(){
var val = this.value;
if(typeof val === "number"