码迷,mamicode.com
首页 > 其他好文 > 详细

函数声明

时间:2016-04-24 21:52:50      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:

语法

function name([param,[, param,[..., param]]]) {
   [statements]
}
name
函数名
param
传递非函数的参数名,参数个数最多255个。
statements
构成函数体的语句。

描述

通过函数声明构造的函数是Function对象,所以拥有一切Function对象所有的属性,方法和行为。

函数默认返回undefined,如果想返回其他值,函数必须使用return语句来返回你想返回的值。

 

通过条件语句判断创造的函数

函数可以通过条件语句来声明,也就是说函数可以内嵌在if语句中。

除了Mozilla之外的所有浏览器都将用条件语句来声明的函数当做没有条件语句的声明并且无论if判断true还是false都将创造一个函数。

  所以不要通过if语句的条件判断来选择性的声明一个函数,你可以在if语句中选择使用函数表达式方法来创建函数。

函数声明提前Function declaration hoisting

在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环境下的执行效果:

  1. 函数语句可以使用与任何普通语句允许使用的地方,包括语句块中:
    if (true) {
      function f(){ }
    }
    else {
      function f(){ }
    }
  2. 函数语句可以被解析成任何其他语句,包括在条件语句执行中:
    if (true) {
      function foo(){ return 1; }
    }
    else {
      function foo(){ return 2; }
    }
    foo(); // 1
    //注意除了Gecko环境下的其他浏览器将会将‘foo’解释成一个函数声明,
    // 第二个‘foo’将会覆盖掉第一个‘foo’,所以返回的结果是“2”,而不是“1”

     

  3. 函数语句不是在变量实例化的时候执行声明的,它们和函数表达式一样,是在运行的时候执行声明的。然而,一旦被声明,函数语句的标识符将在这个函数作用域中可以被使用,这也是函数声明和函数表达式之间的不同。
    // 此时,‘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; };
    }

     

  4. 最后,在早期的基于Gecko的环境(Firefox版本小于等于3)中,函数语句会覆盖函数声明。然而早期版本的浏览器会覆盖失败。
    // 函数声明
    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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!