從new Function創建函數聯想到MVC模式

来源:http://www.cnblogs.com/ssh-007/archive/2016/03/08/5253207.html
-Advertisement-
Play Games

我們知道任何一個自定義函數都是Function構造器的實例,所以我們可以通過new Function的方式來創建函數,使用語法很簡單, new Function(形參1, 形參2, ..., 形參N, 函數體) 註意,裡面的參數全部是以字元串的形式呈現。比如一個簡單的例子——要求寫一個函數, 求兩個


我們知道任何一個自定義函數都是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;   //2

當然,看到這裡,我們並沒有看出以函數構造器的方式創建函數相對於聲明式函數來說具有某方面的優勢。但我們繼續看下一個稍複雜點的例子:

寫一個函數, 傳入任意個參數, 求最大值 。我們以這兩種方法寫出它。

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);    //16
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);   //16

然後我們可以將上面的代碼優化一下,將函數體抽出來放在獨立的一個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)  //10
</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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本示例使用HTML5的canvas標簽和Javascript腳本,簡單的編寫了裝載圖片效果, 請使用支持HTML5的瀏覽器預覽效果: 下圖為以逐漸橫向柵格的效果圖 html部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8
  • 介紹vw、vh,然後對三篇文章做一個總結。屏幕適配是一個很容易被忽略的問題,但對於精益求精的產品而言,是必不可少的。對於Web開發的求職者而言,也是一個必需要理解清楚的經典問題
  • 回到占占推薦博客索引 bootstrap已經用了有段時間了,感覺在使用上還是比較容易接受的,在開發人員用起來上,也還好,不用考慮它的相容性,手機,平臺,PC都可以有效的相容。 bootstrap官方api:http://v3.bootcss.com/ Bootstrap~學習筆記索引 Bootstr
  • 一:需求分析 1)需要首頁,末頁功能 2)有點擊查看上一頁,下一頁功能 3)頁碼到當前可視頁碼最後一頁刷新頁面 二:功能實現思路 也是分為三部分處理 1)點擊首頁,末頁直接顯示第一頁或者最後一頁內容,當前頁面為第1頁或者最後一頁。隱藏首頁或者末頁按鈕。demo 顯示截圖 首頁狀態 和 末頁狀態代碼執
  • HTML 教程 HTML 簡介 html div 標簽介紹 html span 標簽介紹 html a 超鏈接標簽 HTML Br換行標簽介紹 HTML P段落標簽介紹 HTML br與p標簽區別 Html H 標題標簽 html px em pt長度單位 HTML B 加粗標簽 HTML stro
  • 在很多現實的場景中,有的文本框我們希望在選擇“是”的按鈕之後才出現,這就需要js控制TR的隱藏和顯示,如何控制,本文為大家揭曉 下文分享的一段代碼:選擇是的按鈕就顯示身高和體重的文本框的代碼。註意:ready方法必須要引用jquery的庫。 1.html Code <html> <head> <me
  • 看到網上很多展示html5雪花飛動的效果,確實非常引人入勝,我相信大家也跟我一樣看著心動的同時,也很好奇,想研究下代碼如何實現;雖然哦很多地方也能下載這些源碼,不過也不知道別人製作此類動畫時的思路及難點分析。 我這幾天剛好學習了一下,也趁著此刻有時間從需求分析、知識點、程式編寫一步步給大家解剖下。
  • 1. css屬性命名區分大小寫嗎? 不區分,不過一般小寫,便於理解 2. margin-top和margin-bottom對於行內(內斂inline)元素效果一樣麽? 3.padding-top和padding-bottom對於inline元素都會增加元素本身的大小麽? 回答2,3,需要瞭解html...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...