一直對Function()一知半解,今日就Function()的使用做一下總結
一、函數實際是功能完整的對象,用Fucntion()直接創建函數。
語法規則:
var 函數名 = new Function( arg1, arg2, arg3, ..., argN, body );
解釋:
Function 構造函數所有的參數都是字符串類型的,body是生成函數的函數體。
實例:求多個參數的和
var fnSum = new Function( 'var total = 0,args = arguments;for (var i = 0; i < args.length; i++ ) {total += args[ i ];}return total;' ); var res = fnSum(4,5,6); alert ( res );View Code
注意:以上代碼不允許有空格
對以上寫法加以改進
第一種寫法(傳統):將字符串分割
var fnSum = new Function( 'var total = 0, ' + ' args = arguments;' + 'for ( var i = 0; i < args.length; i++ ) { ' + ' total += args[ i ]; ' + '} ' + 'return total; ' ); var res = fnSum( 1,2,3,4 ); alert ( res );//10View Code
第二種寫法:吸收了MVC思想
<script id="engin"> /*var total = 0, args = arguments, len = args.length; for ( var i = 0; i < len; i++ ) { total += args[ i ]; } return total;*/ </script> <script> var getBody = function ( id ) { var script = document.getElementById( id ); var body = script.innerHTML.replace('/*', '').replace('*/', ''); script.parentNode.removeChild( script ); return body; } onload = function () { var fnSum = new Function( getBody( 'engin' ) ); var res = fnSum( 1, 2, 3 ); alert( res ); //6 };View Code
二、Function 和 eval 都可以實現字符串執行代碼在實際開發中, 如果考慮效率可以直接使用 eval,但是考慮安全性則建議使用 Function
var str = '{ name: "jim" }'; eval( 'var o = ' + str ) //var o = eval( '(' + str + ')' ); 等同於上句 console.log(o);//Object {name: "jim"}
eval( 'var a = 10;' ); // eval 會污染全局變量 eval 等價於 var a = 10;//全局變量
eval()
是一個頂級函數並且跟任何對象無關。
eval()
的參數是一個字符串。如果字符串表示了一個表達式,eval()會對表達式求值。如果參數表示了一個或多個JavaScript聲明, 那麼eval()會執行聲明。不要調用eval()來為算數表達式求值; JavaScript 會自動為算數表達式求值。
如果要將算數表達式構造成為一個字符串,你可以用eval()在隨後對其求值。比如,你有一個變量 x ,你可以通過一個字符串表達式來對涉及x的表達式延遲求值,將 "3 * x + 2
",當作變量,通過在腳本中調用eval(),隨後求值。
如果參數不是字符串,
eval()將會將參數原封不動的返回。
在下面的例子中,字符串構造器是指定的,eval()返回了字符串對象而不是對字符串求值。
eval()
是一個危險的函數, 它可以像擁有調用者的權力一樣調用代碼。如果你使用了字符串來運行eval(),那麼你的代碼可能被惡意方(不懷好意的人)影響, 通過在使用方的機器上使用惡意代碼,可能讓你失去在網頁或者擴展程序上的權限 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval