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

时间:2022-09-10 10:36:33

一直对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&num; 后台通过网络地址访问百度地图取回当前在地图上的经纬度&comma;并将取回的复杂Json格式字符串反序列化&lpar;Newtonsoft&period;Json&rpar;

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

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

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

  4. JSON&lpar;五)——同步请求中使用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. C&plus;&plus;虚函数、虚继承、对象内存模型(转)

    参考:http://blog.csdn.net/hxz_qlh/article/details/14633361 需要注意的是虚继承.多重继承时类的大小.

  2. Andoird自定义ViewGroup实现竖向引导界面

    一般进入APP都有欢迎界面,基本都是水平滚动的,今天和大家分享一个垂直滚动的例子. 先来看看效果把: 首先是布局文件: <com.example.verticallinearlayout.Ver ...

  3. ie下使用firebug

    https://getfirebug.com/firebuglite/ 是介绍firebug在别的浏览器如何使用 或者在html中引入firebug-lite.js,然后安F12 <script ...

  4. input模糊搜索功能

    <!doctype html> <meta charset="utf-8"> <style type="text/css"> ...

  5. 获取调用者Class和method、反射获取get方法、获取注解信息

    调用者Class 及 method StackTraceElement stacks[] = Thread.currentThread().getStackTrace(); for (StackTra ...

  6. Ubuntu14&period;04下手动建立快捷方式

    先在桌面创建一个文件:文件内容如下 [Desktop Entry]Encoding=UTF-8Name=eclipseComment=eclipse ideExec=/home/mars/eclips ...

  7. poi 导入导出的api说明(大全)

    原文链接:http://www.cnblogs.com/qingruihappy/p/8443101.html poi 导入导出的api说明(大全) 一. POI简介 ApachePOI是Apache ...

  8. pygame 笔记-4 代码封装&amp&semi;发射子弹

    继续之前的内容,随着游戏的内容越来越复杂,有必要把代码优化一下,可以参考OOP的做法,把人物类抽象出来,弄成一个单独的类,这们便于代码维护,同时我们给小人儿,加个发射子弹的功能,代码如下:(看上去略长 ...

  9. vue路由跳转到指定页面

    1.this.$router.push({name:'Home'}) 2.this.$router.push({path:'/view'}) 3.this.$router.replace({name: ...

  10. 【C&num;】异步的用法

    1. C#5.0 加入了async, await关键字. async是在声明异步方法时使用的修饰符, 声明放在返回值之前即可,await表达式则负责消费异步操作, 不能出现在catch或finally ...