标签:
语法
function name([param,[, param,[..., param]]]) { [statements] }
name
param
statements
通过函数声明构造的函数是Function对象,所以拥有一切Function对象所有的属性,方法和行为。
函数默认返回undefined,如果想返回其他值,函数必须使用return语句来返回你想返回的值。
函数可以通过条件语句来声明,也就是说函数可以内嵌在if语句中。
除了Mozilla之外的所有浏览器都将用条件语句来声明的函数当做没有条件语句的声明并且无论if判断true还是false都将创造一个函数。
所以不要通过if语句的条件判断来选择性的声明一个函数,你可以在if语句中选择使用函数表达式方法来创建函数。
在JS中函数声明将会提前于函数定义。所以你可以在函数声明之前使用它们:
hoisted(); // logs "foo" function hoisted() { console.log("foo"); }
注意函数表达式没有提前,所以你不可以在定义函数之前使用:
notHoisted(); // TypeError: notHoisted is not a function var notHoisted = function() { console.log("bar"); };
下面的代码声明了一个返回总销量的函数,传递给函数的参数是商品a,b,c的数量。
function calc_sales(units_a, units_b, units_c) { return units_a*79 + units_b * 129 + units_c * 699; }
除非你是书写专门针对基于Gecko的环境,否则我不建议你使用函数声明来创建函数,下面都是基于Gecko环境下的执行效果:
if (true) { function f(){ } } else { function f(){ } }
if (true) { function foo(){ return 1; } } else { function foo(){ return 2; } } foo(); // 1 //注意除了Gecko环境下的其他浏览器将会将‘foo’解释成一个函数声明, // 第二个‘foo’将会覆盖掉第一个‘foo’,所以返回的结果是“2”,而不是“1”
// 此时,‘foo‘没有被声明 typeof foo; // "undefined" if (true) { //一旦语句块进入,‘foo’将被声明并且在整个作用域中可以使用 function foo(){ return 1; } } else { //这个语句块将永远不会进入,所以函数将用于不会被二次声明 function foo(){ return 2; } } typeof foo; // "function"
var foo; if (true) { foo = function foo(){ return 1; }; } else { foo = function foo() { return 2; }; }
// 函数声明 function foo(){ return 1; } if (true) { // 用函数声明的方式重写 function foo(){ return 2; } } foo(); // 在firefox版本小于等于3的时候返回1,在firefox版本大于等于3.5的时候返回2 // 然而,这个在重写函数表达式的时候将不会发生 var foo = function(){ return 1; }; if (true) { function foo(){ return 2; } } foo(); // 2 在所有版本中都将返回2
注意早期的Safari(至少1.2.3, 2.0 - 2.0.4 和1.2.3, 2.0 - 2.0.4 ,也有可能更早的版本)函数语句的实现是基于SpiderMoneky(javascript的解释引擎)。上面“特性”章节下的所有例子(除了最后一个例子)都是那些早期版本下的Safari的效果,同时也是firefox下面的效果,另一个遵从相同语义的浏览器是黑莓浏览器。巨大的行为表现差异再次说明了使用函数声明来定义函数是多么的不靠谱。
标签:
原文地址:http://www.cnblogs.com/RachelChen/p/5428160.html