Function構造函數

  使用Function構造函數, 也可以建立函數, 和使用關鍵字function定義函數有幾點區別:javascript

  使用function關鍵字這樣定義函數:java

var f = function(x,y) {return x+y};

  使用Function構造函數定義函數要這樣寫:瀏覽器

var f = new Function("x", "y", "return x+y");

  使用new Function構造函數建立函數有3個注意點:微信

  1:在JS運行的時候能夠動態建立Function;app

  JQ做者寫的模板引擎就是經過new Function形式建立出來的:http://ejohn.org/blog/javascript-micro-templating/ide

// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
(function(){
  var cache = {};
  
  this.tmpl = function tmpl(str, data){
    // Figure out if we're getting a template, or if we need to
    // load the template - and be sure to cache the result.
    var fn = !/\W/.test(str) ?
      cache[str] = cache[str] ||
        tmpl(document.getElementById(str).innerHTML) :
      
      // Generate a reusable function that will serve as a template
      // generator (and which will be cached).
      new Function("obj",
        "var p=[],print=function(){p.push.apply(p,arguments);};" +
        
        // Introduce the data as local variables using with(){}
        "with(obj){p.push('" +
        
        // Convert the template into pure JavaScript
        str
          .replace(/[\r\t\n]/g, " ")
          .split("<%").join("\t")
          .replace(/((^|%>)[^\t]*)'/g, "$1\r")
          .replace(/\t=(.*?)%>/g, "',$1,'")
          .split("\t").join("');")
          .split("%>").join("p.push('")
          .split("\r").join("\\'")
      + "');}return p.join('');");
    
    // Provide some basic currying to the user
    return data ? fn( data ) : fn;
  };
})();

  2:Function()構造函數建立的函數的執行效率比較低;函數

        var a = new Date();
        var x = a.getTime();
        for(var i=0;i<100000;i++){
            function EE(){   //使用function語句定義的空函數
                
            }
        }
        var b = new Date();
        var y = b.getTime();
        alert(y-x);    //62,不一樣環境和瀏覽器會存在差別
        // 測試Function構造函數定義的空函數執行效率
        var a = new Date();
        var x = a.getTime();
        for(var i=0;i<100000;i++){
            new Function();  //使用Function構造函數定義的空函數
        }
        var b = new Date();
        var y = b.getTime();
        alert(y-x);    //2390

  3:Function()構造函數建立的函數執行做用域是全局的;測試

        var fn = new Function("x", "return x*x+y");
        var y = 3;
        alert(fn(3));
        (function(){
            var y = 2;
            alert(fn(3));
        }());

 

做者: NONO
出處:http://www.cnblogs.com/diligenceday/
QQ:287101329
微信:18101055830 this

相關文章
相關標籤/搜索