Function的一些结论与eval函数.
1.1 函数的创建方式
- 1 函数声明
- 2 函数表达式
- 3 new Function
// 1
function foo() {} // 2
var foo = function() {}; // 3new Function使用
// 语法
var 函数名 = new Function( arg1, arg2, arg3, ..., argN, body ); // 解释
// Function 构造函数所有的参数都是字符串类型的
// 除了最后一个参数, 所有的参数都作为生成函数的参数. 这里可以没有参数
// 最后一个参数也是字符串, 表示的是生成函数的函数体
function max( a, b ) {
return a > b ? a : b;
}
var fnMax = new Function( 'a', 'b', 'return a > b ? a : b;' );
var res = fnMax( 1, 2 );
1, 有两个参数的时候
function sum( a, b ) {
return a + b;
}
var fnSum = new Function( 'a', 'b', 'return a + b;' );
var res = fnSum( 123, 456 );
alert( res );
2, 多个参数的时候
/*
function sum() {
var total = 0,
args = arguments,
len = args.length;
for ( var i = 0; i < len; i++ ) {
total += args[ i ];
}
return total;
} var res = sum( 1, 2, 3, 4, 5 );
alert( res );
*/ // new Function var fnSum = new Function( 'var total = 0, args = arguments, len = args.length;for ( var i = 0; i < len; i++ ) {total += args[ i ];}return total;' ); var res = fnSum( -1, 1,1,1,1,1,1 );
alert ( res );
// 解决这个问题比较晦涩, 代码难以维护
// 给出两个解决方案
// 1, 传统
// 将字符串进行换行分割
// 将字符串进行换行分割
var fnSum = new Function(
'var total = 0, ' +
' args = arguments, ' +
' len = args.length; ' +
'for ( var i = 0; i < len; i++ ) { ' +
' total += args[ i ]; ' +
'} ' +
'return total; '
);
var res = fnSum( 1,1,1,1,1,1 );
alert ( res );
// 2, 吸收了 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 );
};
</script>
// 使用 Function 和 使用 eval
他们都有一个共同 的特点, 可以将字符串作为 js 代码来执行
区别
考虑效率使用eval
考虑安全性用Function
eval 会造成 全局污染
// eval 函数的语法
// eval( 字符串 )
// 这个函数在调用的时候会将字符串作为 js 代码来执行 var a = 10;
eval( 'var a = 10;' ); console.log( a );
// 应用方向比较的广泛, 可以利用该方法实现动态操作
// 1, ajax
// 服务器与浏览器交互, 服务器发给浏览器的数据是一个字符串
// 那么要执行这个代码, 就需要将字符串作为 代码执行, 这个就要用到 eval var str = '{ name: "jim", age: 19, gender: "男" }';
// '[{{}},{{},[]}]'
// 当从服务器拿到字符串以后, 理论上应该将其作为数据对象使用
// 解析字符串
// 传统的做法
/*
str = str.replace('{', "").replace("}", "");
// ' name: "jim", age: 19, gender: "男" '
var arr = str.split( ',' );
// [ ' name: "jim"', ' age: 19', ' gender: "男" ' ] var o = {};
for ( var k in arr ) {
var tempArr = arr[ k ].split( ':' ); // 去空格
var key = tempArr[ 0 ].trim();
var value = tempArr[ 1 ].trim(); o[ key ] = value; } console.log( o.name );
console.log( o.age );
console.log( o.gender );
*/ var o1 = { }; // var o2 = eval( "(" + str + ")" ); var o2 = eval( str ); console.log( o2.name );
console.log( o2.age );
console.log( o2.gender );
// eval("(" + str + ")") 小括号解释:
// () 会被解释成代码块而非对象字面量
- JavaScript中
{}的用法:
1 代码块,用来包裹代码,组织语句
2 对象直接量/对象字面量
- 使用eval将字符串转化为对象的两种方式
// 1
eval("var o = " + str);
// var obj = {}; // 2
var o = eval("(" + str + ")"); // 然后就可以把这个字符串当作是对象来使用了
Function的一些结论与eval函数.的更多相关文章
- js eval()函数 接收一个字符串,做为js代码来执行。 如: s='var d="kaka"'; 或者s=‘function (code){return code }’;
eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法“{}”并不能返回一个值, ...
- eval函数的工作原理
如果您想详细了解eval和JSON请参考以下链接: eval :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Glob ...
- js的eval函数解析后台返回的json数据时为什加上圆括号eval("("+data+")"),而HTML页面定义的数据不用
一,情况如下,这是成功代码: $(function () { $.ajax({ url: "Demo.aspx", type: "post", data: { ...
- Javascript eval()函数 基础回顾
如果您想详细了解ev al和JSON请参考以下链接: eval :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Glo ...
- python]用eval强制将字符串转换为字典变量时候出错:NameError: name 'null' is not defined[python]用eval函数 字符串转dict
本博客已搬家至个人网站 在路上 - On the way 下面的 技术 分类. 你可以通过点击 更新帖子 [已解决]Python中,用eval强制将字符串转换为字典变量时候出错:NameError: ...
- JavaScript中eval函数的用法
1. eval函数会计算传给的字符串, 并把作为脚本代码来执行. eval(str) 此函数接受一个字符串作为参数,并把str当做一段JavaScript脚本代码来执行,如果str执行结果返回一个值则 ...
- 浅谈JavaScript eval() 函数
用js的人都应该知道eval()函数吧,虽然该函数用的极少,但它却功能强大,那么问题来了,为什么不常用呢?原因很简单,因为eval()函数是动态的执行其中的字符串,里面有可能是脚本,那么这样的话就有可 ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- JavaScript中Eval()函数的作用
这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...
随机推荐
- 【Computer Vision】图像单应性变换/投影/仿射/透视
一.基础概念 1. projective transformation = homography = collineation. 2. 齐次坐标:使用N+1维坐标来表示N维坐标,例如在2D笛卡尔坐标 ...
- UNIX系统高级编程——第六章-系统数据文件和信息-总结
口令文件: /* The passwd structure. */ struct passwd { char *pw_name; /* Username. */ char *pw_passwd; /* ...
- c的面向对象思想记录
在一家公司做实习生,努力学习,keep moving. //c1.h typedef struct { +]; int (*tr)(); } trans; //c1.c #include<str ...
- Vue组件通信之Bus
关于组件通信我相信小伙伴们肯定也都很熟悉,就不多说了,对组件通信还不熟悉的小伙伴移步这里. 在vue2.0中 $dispatch 和 $broadcast 已经被弃用.官方文档中给出的解释是: 因为基 ...
- 【图灵杯 J】简单的变位词
Description 变位词是指改变某个词的字母顺序后构成的新词.蔡老板最近沉迷研究变位词并给你扔了一道题: 给你一些单词,让你把里面的变位词分组找出来.互为变位词的归为一组,最后输出含有变位词最多 ...
- drupal7 怎样将一个date字段加入上日期插件效果
//这里以created字段为样例 function Hook_form_alter($form,$form_state,$form_id){ $form['created']['#type'] = ...
- css中使用id和class 的不同
在 CSS 中,类选择器以一个点号显示: .center {text-align: center} 在上面的样例中,全部拥有 center 类的 HTML 元素均为居中. 在以下的 HTML 代码中, ...
- Unity3d 开发(七)AssetBundle组织文件夹
本文探讨怎样配置一个AssetBundle更为合理. 对于结构为 的文件夹结构,当中shared是Hero文件夹下须要用到的公用资源.即公有依赖.可採用例如以下的打包策略 整个文件夹打包 将整个100 ...
- 微信公众号开发将war包导入新浪sae出现错误
JAVA_Error: Error for /wechat.do java.lang.NoSuchFieldError: INSTANCE at org.apache.http.impl.io.Def ...
- mysql-联结
一.联结 联结是利用SQL的select能执行的最重要的操作. 1.关系表:假如有一个包含产品目录的数据库表,其中每个类别的物品占一行.对于每种物品要求存储的信息包括产品描述和价格,以及生产该产品的供 ...