我们知道任何一个自定义函数都是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. 【Java/Android性能优3】Android性能调优工具TraceView使用介绍

    本文转自:http://blog.csdn.net/innost/article/details/9008691 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是 ...

  2. VS2013 支持python和nodejs

    一.在VS2013中,安装python的支持 1. http://pytools.codeplex.com/下载插件 2. https://www.python.org/download/下载Pyth ...

  3. ionic 中使用ion-slide-box

    ion-slide-box 用法: <ion-slide-box class="slide" auto-play="true" does-continue ...

  4. Linux 网卡设备驱动程序设计(3)

    三.网络子系统深度分析 用户程序通过网络发送这个网络数据包 通过 SCI 协议无关接口 协议栈 <   UDP的实现  会选择路由 <    IP的实现  会建立这个邻居子系统,建立邻居信 ...

  5. C#导出数据至excel模板

    开源分享最近一个客户要做一个将数据直接输出到指定格式的Excel模板中,略施小计,搞定 其中包含了对Excel的增行和删行,打印预览,表头,表体,表尾的控制 using System; using S ...

  6. 《JavaScript高级程序设计》笔记——关于继承

    继承在JavaScript中是一种“奇葩”的存在,因为其本身并没有类(class)的概念(ES5),所以只能用其他方式(原型链.构造函数.对象实例)来模拟继承的行为.既然是模拟,那就应该是想办法实现继 ...

  7. 获取动态SQL的返回结果

    1. 介绍说明 有时候在执行存储过程后,需要获取存储过程返回的列表,然后进行相应操作的情况,或者执行动态语句,获取返回结果的情况,通过EXEC ,sp_executesql可以实现该功能. 网上也有很 ...

  8. Android语音识别(本地+第三方)

    语音识别主要的功能就是在用户不方便输入的时候找一个替代输入的选择. 1.本地语音识别 下面的代码首先创建SpeechRecognizer对象,并设置回调函数监听器.当在点击监听器中调用doSpeech ...

  9. Activity生命周期-Android

    Activity常见的三种生命周期: 1.完整生命周期 oncreate-->onstart-->onresume-->onpause-->onstop-->ondest ...

  10. 坑到了,EF执行带事物的存储过程

    用EF开发项目,今天调用 带事物 存储过程,始终报错,"EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配.上一计数 = 1,当前计数 = 0.\r\nEXEC ...