码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript系列----函数(Function)篇

时间:2015-02-09 15:41:08      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

 1.函数                            

        在W3C中函数的定义是这么说的:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。

   诚然,从这种抽象的定义中我们得不到什么有价值的东西。下面,举例来列举出函数的几种定义方式:

function add(num1, num2) {
  return num1 + num2;
}
var add = function (num1, num2) {
  return num1 + num2;
}//这是比较常见的两种

//下面两种比较少见
var add=new Function("num1","num2","return num1+num2");
var add=Function("num1","num2","return num1+num2");

 上面四种写法均是创建一个函数正确的语法。但是,常见的一般是前两种。因为相比于前两种,后两种存在着一些缺陷。

  1.  后两种比较繁琐不直观。这点从上面的例子中可以看出。
  2.  后两种存在着一些致命的缺陷。这种函数的创建方式,不能维持一个属于函数的作用域链,在任何时候下(new)Function的创建的函数,都相当于在全局作用域下创建的函  数。以下例子就可以证明这一点。
    1. var x = 1;
      var add = (function () {
        var x = 100;
        return function (num) {
          return num + x;
        }
      }());
      console.log(add(0));//100
      var x = 1;
      var add = (function () {
        var x = 100;
        return new Function(‘num1‘, ‘return num1+x‘);
      }());
      console.log(add(0));//1

       也就是说,后两种方式创建的函数,不能组成完整的函数作用域链(后面会讲到),也不可能有所谓的闭包之说。

  3.  后两种的运行效率太低。
     首先,JS对字符串的解析算不上效率很高,而(new)Function均存在着大量的字符串。
     其次,JS的解释器,对于用function(){},这种形式的函数,都有一定形式的优化。比如下面这样
  4. var array = [
    ];
    for (var i = 0; i < 1000; i++) {
    array[i] = function () {
    return ‘undefined‘;
    }
    }//第一种


    var array = [
    ];
    for (var i = 0; i < 1000; i++) {
    array[i] = new Function("return undefined");
    }//第二种,

          这两种方式在运行效率上存在着很大的差距。对于,第一种只需要执行一次function(){},其他的999次都是赋值,而后一种要执行一千遍的函数创建并赋值。

   正是因为三面的三种原因,才使得function(){}这种方式比较 流行。

       另外,你可能也见过下面的这种,但是这种形式只是一种变体。

var add = new function () {
  return 1 + 2;
};
console.log(typeof add);//object
var result = add.constructor();/*调用时必须采用这种调用方式*/
console.log(result);//3

        这种形式,new function()创建的实质上是利用一个匿名函数创建一个对象。这个对象的一个constructor属性正好指向其构造函数,也就是这个匿名函数。所以实际上这     是一种丑陋的写法。

   到这里,我们也就只是叙述了一下,定义函数的几种方式。通过比较,我们知道前两种比较实用,但是即使这样,第一种和第二中的定义方式也存在着巨大的不同。下一小节,我们接着讲这两种方式存在的差异。

   

JavaScript系列----函数(Function)篇

标签:

原文地址:http://www.cnblogs.com/renlong0602/p/4281463.html

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