1.1 函数的创建方式

  • 1 函数声明
  • 2 函数表达式
  • 3 new Function
// 1
function foo() {} // 2
var foo = function() {}; // 3 new 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函数.的更多相关文章

  1. js eval()函数 接收一个字符串,做为js代码来执行。 如: s='var d="kaka"'; 或者s=‘function (code){return code }’;

    eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法“{}”并不能返回一个值, ...

  2. eval函数的工作原理

    如果您想详细了解eval和JSON请参考以下链接: eval  :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Glob ...

  3. js的eval函数解析后台返回的json数据时为什加上圆括号eval("("+data+")"),而HTML页面定义的数据不用

    一,情况如下,这是成功代码: $(function () { $.ajax({ url: "Demo.aspx", type: "post", data: { ...

  4. Javascript eval()函数 基础回顾

    如果您想详细了解ev al和JSON请参考以下链接: eval  :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Glo ...

  5. python]用eval强制将字符串转换为字典变量时候出错:NameError: name 'null' is not defined[python]用eval函数 字符串转dict

    本博客已搬家至个人网站 在路上 - On the way 下面的 技术 分类. 你可以通过点击 更新帖子 [已解决]Python中,用eval强制将字符串转换为字典变量时候出错:NameError: ...

  6. JavaScript中eval函数的用法

    1. eval函数会计算传给的字符串, 并把作为脚本代码来执行. eval(str) 此函数接受一个字符串作为参数,并把str当做一段JavaScript脚本代码来执行,如果str执行结果返回一个值则 ...

  7. 浅谈JavaScript eval() 函数

    用js的人都应该知道eval()函数吧,虽然该函数用的极少,但它却功能强大,那么问题来了,为什么不常用呢?原因很简单,因为eval()函数是动态的执行其中的字符串,里面有可能是脚本,那么这样的话就有可 ...

  8. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  9. JavaScript中Eval()函数的作用

    这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...

随机推荐

  1. luogu P4018 Roy&October之取石子(博弈论)

    题意 题解 如果n是6的倍数,先手必败,否则先手必胜. 因为6*x一定不是pk 所以取得话会变成6*y+a的形式a=1,2,3,4,5: 然后a一定为质数.我们把a取完就又成为了6*x的形式. 又因为 ...

  2. kubernetes 项目

    1:CI/CD Docker: Harbor Git Jenkins 2:微服务 istio

  3. [terry笔记]11gR2_dataguard_主备库切换

    主备库切换  Switchover  一般SWITCHOVER切换都是计划中的切换,特点是在切换后,不会丢失任何的数据,而且这个过程是可逆的,整个DATA GUARD环境不会被破坏,原来DATA GU ...

  4. NYIST 1019 G.亲戚来了

    G.亲戚来了 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 Bob 一家人要去下馆子,为什么呢?因为他姑姑的大爷的叔叔的孙子的表叔的婶婶的儿子来了,亲戚来了当然要下 ...

  5. Regular Expressions Syntax

    https://support.syslogwatcher.com/support/solutions/articles/8000033627-regular-expressions-syntax

  6. Qt资料大全

    简述 发福利了.发福利了.发福利了,重要的事情说三遍... 为了方便更多Qter了解.学习Qt,现将相关资源进行整理,主要内容包括:Qt官网.编码风格.GitHub & Third-Party ...

  7. 电源管理ACPI、及APM、GNU/Linux系统下的相应命令使用

    /*********************************************************************  * Author  : Samson  * Date   ...

  8. windows环境利用apache 配置虚拟主机

    windows环境利用apache 配置虚拟主机 1.改动http.host #LoadModule vhost_alias_module modules/mod_vhost_alias.so #In ...

  9. linux系统调用表(system call table)

    系统调用号 函数名 入口点 源码 0 read sys_read fs/read_write.c 1 write sys_write fs/read_write.c 2 open sys_open f ...

  10. zookeeper应用场景练习(分布式锁)

    在寻常的高并发的程序中.为了保证数据的一致性.因此都会用到锁.来对当前的线程进行锁定.在单机操作中.非常好做到,比方能够採用Synchronized.Lock或者其它的读写多来锁定当前的线程.可是在分 ...