一直对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 );

注意:以上代码不允许有空格

对以上写法加以改进

第一种写法(传统):将字符串分割

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 );//

第二种写法:吸收了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 ); //
};

二、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;//全局变量

mdn:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval

eval()是一个顶级函数并且跟任何对象无关。

eval()的参数是一个字符串。如果字符串表示了一个表达式,eval()会对表达式求值。如果参数表示了一个或多个JavaScript声明, 那么eval()会执行声明。不要调用eval()来为算数表达式求值; JavaScript 会自动为算数表达式求值。

如果要将算数表达式构造成为一个字符串,你可以用eval()在随后对其求值。比如,你有一个变量 x ,你可以通过一个字符串表达式来对涉及x的表达式延迟求值,将 "3 * x + 2",当作变量,通过在脚本中调用eval(),随后求值。

如果参数不是字符串,eval()将会将参数原封不动的返回。在下面的例子中,字符串构造器是指定的,eval()返回了字符串对象而不是对字符串求值。

eval() 是一个危险的函数, 它可以像拥有调用者的权力一样调用代码。如果你使用了字符串来运行eval(),那么你的代码可能被恶意方(不怀好意的人)影响, 通过在使用方的机器上使用恶意代码,可能让你失去在网页或者扩展程序上的权限

在JS中将JSON的字符串解析成JSON对象格式,一般有三种方式:

1.一种为使用eval()函数。

var str = '{ "name": "yy", "gender": "girl" }';
var obj = eval('('+str+')');
console.log(obj)//Object {name: "yy", gender: "girl"}

2. 使用Function对象来进行返回解析。

var str = '{ "name": "yy", "gender": "girl" }';
var obj = (new Function('','return'+str))();
console.log(obj);//Object {name: "yy", gender: "girl"}

3.使用JSON.parse()

var str = '{ "name": "yy", "gender": "girl" }';
var obj = JSON.parse(str);
console.log(obj);//Object {name: "yy", gender: "girl"}

关于new Function使用以及将json格式字符串转化为json对象方法介绍的更多相关文章

  1. 将符合json的字符串转化为json对象

    变量data是符合json格式的字符串 var data="[key:value]"; 第一种方式: var jsonData = eval("("+data+ ...

  2. C# 后台通过网络地址访问百度地图取回当前在地图上的经纬度,并将取回的复杂Json格式字符串反序列化(Newtonsoft.Json)

    直接上代码:解释都在代码中 ak 要自己去百度地图申请. 其中申请ak的时候,有个属性render直接填*就行. namespace HampWebControl 是我的空间命名! namespace ...

  3. 通过获取客户端Json数据字符串,反序列化为实体对象的一段代码

    #region 保存候选人数据 /// <summary> /// 保存候选人数据 /// </summary> /// <param name="entity ...

  4. JSON(五)——同步请求中使用JSON格式字符串进行交互(不太常见的用法)

    在同步请求中使用JSON格式进行数据交互的场景并不多,同步请求是浏览器直接与服务器进行数据交互的大多是用jsp的标签jstl和el表达式对请求中的数据进行数据的渲染.我也是在一次开发中要从其它服务器提 ...

  5. JSON(二)——JavaScript中js对象与JSON格式字符串的相互转换

    首先我们来看一下js中JSON格式的字符串 var JSONStr1 = "{\"name\" : \"张三\"}"; 注意以下的写法不是j ...

  6. FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换

    当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('g ...

  7. js实现配置菜品规格时,向后台传一个json格式字符串

    由于本公司做的是订餐平台,那么在上传菜品时,需要配置菜品规格,比如份量(大中小),味道(猛辣,中辣,微辣) 由于这些数据,在表的设计时 没有保存到菜品表,那么在点击保存菜品数据时,配置规格这块数据,我 ...

  8. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...

  9. List转换成json格式字符串,json格式字符串转换成list

    一.List转换成json字符串 这个比较简单,导入gson-x.x.jar, List<User> users = new ArrayList<User>(); Gson g ...

随机推荐

  1. javascript学习笔记(2)

    <html> <head><title>Throwing die</title><script>    var canv_width  = ...

  2. FLAG_ACTIVITY_NEW_TASK和SingleInstance的设计思路(多task的应用)

    这部分的想法都是基于以下两点: 1.Activity可能被复用,可能是复用Activity的功能,还可能是复用Activity的状态: 2.Task的作用:target,同一个task中的Activi ...

  3. ARM Cortex-M3内核的巨大优势

    ARM Cortex-M3相比于ARM其他系列微控制器,具有以下优势或特点: 1. 三级流水线+分支预测 ARM Cortex-M3与ARM7内核一样,采用适合于微控制器应用的三级流水线,但增加了分支 ...

  4. 微软Windows 7 “可启动U盘”制作工具及使用方法,非常的简单

    目前,用“可启动U盘”替代光驱光盘安装操作系统,已经成为一种时尚(至少对没有刻录机或不愿购买光碟的群体是这样).制作“可启动U盘”的方法和工具很多,区别无非是制作的难易程度和对“U盘类型”的支持程度. ...

  5. poj1969---找规律

    题意:按照s型分别给数编号,给 #include <stdio.h> #include <stdlib.h> int main() { int n; while(scanf(& ...

  6. Sql Server 2008 卸载重新安装失败的解决办法!(多次偿试,方法均有效!)

    Sql Server 2008 卸载重新安装失败的解决办法!(多次偿试,方法均有效!) 1.控制面板中卸载所有带sql server的程序. 2.在C盘C:\Program Files中sqlserv ...

  7. #include <map>

    //tuple多元数组,必须是静态数组,类似结构体 //配合array,vector使用 //std::tuple<数组元素类型>数组变量名(数组元素变量名); #include < ...

  8. Address already in use: JVM_Bind <null>:8080

    解决方法: 1重开eclipse,端口号被占用,或者杀掉进程

  9. Css 使div标签下沉到页面最低部

    .footer{ position:fixed; bottom:0; } 使用这两个标签就能达到效果

  10. SQLSERVER 列名无效

    很多时候对数据库表修改字段后会出现“列名无效”,或者在查询分析器里面是红色的下划线,造成这个现象的原因是:SQL Server的intellisense(智能感知功能),没有感知到更改,需要重新整理一 ...