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()类似. ...
随机推荐
- 紫书 例题8-10 UVa 714 (二分答案)
这道题让最大值最小, 显然是二分答案 当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案 为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点 就全部枚举一遍, 验证答案 ...
- redhat下搭建jdk+tomcat环境
由于redhat自带安装了jdk,我们需要现将其进行卸载 卸载系统自带的jdk版本: 查看自带的jdk: 输入命令:rpm -qa|grep gcj 可能看到如下类似的信息: libgcj-4.1.2 ...
- Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP
JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...
- jquery IE7 下报错:SCRIPT257: 由于出现错误 80020101 而导致此项操作无法完成
非IE(内核)浏览器运行正常,在IE中运行异常,一般考虑为js中多了符号. 常见的有: 1.上面的html注释"<!-- -->",这种 ...
- 转:强制Visual Studio以管理员身份运行
Windows 8的一个既安全又蛋疼之处是UAC的行为被改变了.以往在Windows 7中,只要关闭了UAC,自己的帐号又是本机管理员组的,任何程序都会以管理员身份启动.然而,在Windows 8上, ...
- Qt之QToolButton
简述 QToolButton类提供了用于命令或选项可以快速访问的按钮,通常可以用在QToolBar里面. 工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标. 简述 详细描述 常用接口 更多参考 ...
- HTTP Analyzer(实时分析HTTP/HTTPS数据流)
简述 HTTP Analyzer是一款实时分析HTTP/HTTPS数据流的工具.它可以实时捕捉HTTP/HTTPS协议数据,可以显示许多信息(包括:文件头.内容.Cookie.查询字符窜.提交的数据. ...
- E-UTRA channel bandwidths per operating band (36.101)
E-UTRA channel bandwidths per operating band (36.101) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/ ...
- [poj 2773] Happy 2006 解题报告 (二分答案+容斥原理)
题目链接:http://poj.org/problem?id=2773 题目大意: 给出两个数m,k,要求求出从1开始与m互质的第k个数 题解: #include<algorithm> # ...
- [湖南师大集训2018 7 26] hunger 解题报告 (SPFA)
饿 (hungry.pas/c/cpp) [背景描述] 给出