我们知道任何一个自定义函数都是Function构造器的实例,所以我们可以通过new Function的方式来创建函数,使用语法很简单,

new Function(形参1, 形参2, ..., 形参N, 函数体)

注意,里面的参数全部是以字符串的形式呈现。比如一个简单的例子——要求写一个函数, 求两个数字中最大的数字, 并返回最大数字。如果按照声明式函数的思想来写,可能会是这样

function max(a,b){
return a > b ? a : b;
}

但我们转化到函数构造器(new Function)的方式去写,会是这样

var fn = new Function('a','b','return a>b?a:b');
var max = fn(1,2);
max; //

当然,看到这里,我们并没有看出以函数构造器的方式创建函数相对于声明式函数来说具有某方面的优势。但我们继续看下一个稍复杂点的例子:

写一个函数, 传入任意个参数, 求最大值 。我们以这两种方法写出它。

function max() {
var a = arguments;
var m = a[0];
for (var i = 0; i < a.length; i++) {
if (m < a[i]) {
m = a[i];
}
}
return m;
} var res = max(1, 5, 16, 3,2);
console.log(res); //
var fn = new Function(
'var a = arguments;'+
'var m = a[0];'+
'for (var i = 0; i < a.length; i++) {'+
' if (m < a[i]) {'+
' m = a[i];'+
' }'+
'}'+
'return m;'
); var res = fn(1,5,16,3,2);
console.log(res); //

然后我们可以将上面的代码优化一下,将函数体抽出来放在独立的一个script标签中。

<script id="control">
/*
var max = arguments[0];
for(var i=0;i<arguments.length;i++){
if(arguments[i]>max){
max = arguments[i];
}
}
return max;
*/
</script>
<script>
var fn = new Function(
document.getElementById('control').innerHTML
.trim()
.replace('/*', '')
.replace('*/', '')
)
var foo = fn(1,2,10,4)
console.log(foo) //
</script>

这样写的好处是当需要更改函数方法时,只需要在第一个script标签里面改,并不影响下面script标签。

再补充一点关于函数构造器的作用域的问题,它跟声明式函数的不同是,声明式函数内部可以访问外部或者说外函数的局部变量,但是函数构造器却不能。

var globalVal = 'global'
function fn(){
var localVal = 'local';
function foo(){
console.log(typeof localVal,typeof globalVal);
}
foo()
}
fn() //string string
var globalVal = 'global'
function fn(){
var localVal = 'local';
new Function('console.log(typeof localVal,typeof globalVal);')();
}
fn() // undefined global

从new Function创建函数联想到MVC模式的更多相关文章

  1. GreenPlum学习笔记:create or replace function创建函数

    原始表数据如下: 需求:现要求按分号“;”将rate_item列进行分割后插入到新的数据表中. CREATE OR REPLACE FUNCTION fun_gp_test_xxx_20181026( ...

  2. 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组

    真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...

  3. JavaScript创建函数的三种方式

    ㈠函数(function) ⑴函数也是一个对象 ⑵函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码) ⑶函数中可以保存一些代码在需要的时候调用 ⑷使用typeof检查一个函数对象时,会返 ...

  4. MySQL 创建函数(Function)

    目标 怎么样MySQL创建数据库功能(Function) 语法 CREATE FUNCTION func_name ( [func_parameter] ) //括号是必须的,參数是可选的 RETUR ...

  5. mysql 创建函数This function has none of DETERMINISTIC, NO SQL, or READS

    今天在mysql 5.6上创建函数的时候 发现报错: ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or R ...

  6. mysql 创建函数ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_f

    mysql 创建函数的时候 报错 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL D ...

  7. Orcale创建函数(function)

    Oraclec创建函数的语法规则 create or replace function  函数名 (参数名1 参数类型,参数名2 参数类型)  return number  is Result num ...

  8. [置顶] MySQL -- 创建函数(Function

    目标 如何在MySQL数据库中创建函数(Function) 语法 CREATE FUNCTION func_name ( [func_parameter] ) //括号是必须的,参数是可选的 RETU ...

  9. MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators

    问题描述 通过Navicat客户端,创建MySQL函数(根据的当前节点查询其左右叶子节点)时报错,报错信息如下: This function has none of DETERMINISTIC, NO ...

随机推荐

  1. 用英文加优先级来解读C的声明

    比如:int ( * func_p ) ( double ); 首先着眼于标识符. func_p is 因为存在括号,(* func_p) 先被处理,这里着眼于* func_p is a pointe ...

  2. 重构2-Move Method(方法移动)

    重构同样非常简单,以至于人们并不认为这是一个有价值的重构.迁移方法(Move Method),顾名思义就是将方法迁移到合适的位置.在开始重构前,我们先看看一下代码: ) ) return 0.03; ...

  3. Oracle 约束类型

    在Oracle中的约束类型:NOT NULLUNIQUE KeyPRIMARY KEYFOREIGN KEYCHECK create table emp--创建表格 ,注意约束( empno numb ...

  4. python 基础——常用日志装饰器

    from functools import wraps class logit(): def __init__(self, logfile='out.log'): self.log = logfile ...

  5. 初识 Asp.Net内置对象之Request对象

    Request对象 Request对象用于检索从浏览器向服务器所发送的请求信息.它提供对当前页请求的访问,包括标题,Cookie,客户端证书等等.它也与HTTP协议的请求消息对应. Request对象 ...

  6. C#之使用随机数

    1.C#自带随机数函数 using System; System.Random ran = new System.Random();int n = ran.Next(100, 1000);//产生10 ...

  7. html+CSS--水平居中设置(定宽块状元素)

    来源:http://www.imooc.com/code/4336 当被设置元素为 块状元素 时用 text-align:center 就不起作用了,这时也分两种情况:定宽块状元素和不定宽块状元素. ...

  8. 纯css3 transforms 3D文字翻开翻转3D开放式效果

    详细内容请点击 在线预览立即下载 在本教程中,将基于CSS3创建的一个实现一个有趣的3D开放式效果.教程的目的是展示我们如何能带来一些生活上使用CSS3 . html: <ul class=&q ...

  9. C#传递参数

    与函数交换数据的最好方式就是传递参数,在C#中有四种方法来控制参数如何传递给目标方法 C#中的参数修饰符 无修饰 如果一个参数没有用参数修饰符,则认为它将按值传递 out 输出参数由被调用的方法赋值. ...

  10. 如何把rtf、doc文件转换为HTML文件

    //retText是路径 1 public string ExtractHtml(string rtfText) { try { //Create word object Word.Applicati ...