使用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