国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Javascript 元編程初探 [1]

mcterry / 1085人閱讀

摘要:在這里講到的很多也許只和程序對于工作機制的操作有關,但是作為初探也許也就足夠了。一般情況下還有空字符串都會被判斷成。面向特征編程面向特征編程的全稱是。

引子

元編程會有如下的定義:

一種計算機程序的編寫方式,它可以將其它程序(或者其本身)作為數據進行編寫和操作,或者在編譯時做一部分工作,在運行的時候做另外一部分工作。

在這里講到的很多也許只和程序對于工作機制的操作有關,但是作為初探也許也就足夠了。 鑒于我也是邊學邊寫的這篇文章,如果有謬誤之處,還請指出。

創建帶有默認參數的函數
function repeat(func, times) {
    times = (Object.prototype.toString.call(times) === "[object Undefined]")?1:times;
    for(var i = 0; i < times; i++){
        func();
    }
}   

在函數中使用 Object.prototype.toString.call(times) 是為了解決 javascript 判斷值為空的問題,使用這種寫法才會比較的安全。一般情況下 false, 0, undefined, null 還有 空字符串 都會被判斷成 false。

創建自優化的行數

在瀏覽器的實現上會有許多的不同,有時候就需要使用分支。一般情況下都是監測需要調用的對象或者屬性是否存在,進而進行下一步的操作,像下面的一樣:

function addEvent(elem, type, func){
    if (document.addEventListener) {
        elem.addEventListener(type, func);
    } else {
        elem.attachEvent(type, func);
    }
}

雖然這段代碼可能還有很多其它的問題,但是這段代碼每次在執行時都會進行一次判斷,然而理論上應該可以做到只在第一次運行的時候進行判斷: 當第一次調用的時候,針對特定的瀏覽器去將自己重寫成另外的一個版本

function newAddEvent (elem, type, func) {
    if (document.addEventListener){
        newAddEvent = function(element, type, func){
            element.addEventListener(type, func);
        }
    } else {
        newAddEvent = function(element, type, func){
            element.attachEvent(type, func);
        }
    }
    newAddEvent(elem, type, func);
}

在這個函數中,第一次調用的時候會進行判斷支持的方法類型,然后就會替換掉原來函數的內容,最后都會執行新的函數。雖然這個是一個簡單的例子,但是可以把它引申并且使用到其它復雜的環境中去,這樣就可以提高運行的效率了。

面向特征編程(AOP)

面向特征編程的全稱是: Aspect-oriented Programming。面向特征編程本質上就是使用函數執行前后的代碼去擴展當前的函數,而不是使用繼承的方式去擴展。

在調試一段代碼的時候,需要在這個代碼被調用的時候寫一些日志,包括 傳入的參數以及函數調用之后的返回值,并且這樣不會影響到函數的正常執行 ,我們可以這樣寫:

Bar = {
    foo: function(){ ... }
};

Bar.foo = Bar.foo.debug(function(original, args){
        var _r;
        console.log(args);
        _r = original(args);
        console.log(_r);
        return _r;
});

(注: 此處的參數部分簡略寫了,不要在意這些細節~) 我在這里擴展了Function的prototype的方法,將原始函數作為第一個參數傳入,其實還可以稍加改變,在新的一個函數上進行這種包裝。 接下來我們來看看debug的實現:

Function.prototype.debug = function(debugger) {
    var _selfMethod = this; // 原始方法的引用
    return function(){
        var args = [];
        for (var i = 0, argsLength = arguments.length; i < argsLength; i++) {
            args.push(arguments[i]);
        }
        return debugger.apply(this, [_selfMethod.bind(this)].concat(args));
    }
};

這段代碼首先保存了原始函數的一個引用,然后將參數傳入debugger并使用apply執行。


第一次在segmentFault寫blog,也是算對自己的一種鞭策吧,記錄一些所學習的知識,分享一寫學習的心得。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77955.html

相關文章

  • WebGL 初探

    摘要:下面是頂點及片元著色器程序,用字符串表示,它將直接運行在瀏覽器之上。最后,使用將和著色器連接。創建著色器對象創建編程對象賦值已創建的著色器對象連接編程對象檢查鏈接結果鏈接程序失敗使用可用著色器程序這一步主要使用方法告訴使用程序。 該文章于一天前發表在 github,若有問題可提至 github。 目前,我們有很多方案可以快速的接觸到 WebGL 并繪制復雜的圖形,但最后發現我們忽視了很...

    whjin 評論0 收藏0
  • 函數式編程初探

    摘要:函數式編程是一種以函數為基礎的編程方式和代碼組織方式,從程序員的思路上來說,就是將程序拆分并抽象成多個函數,再組裝回去。在這門語言中,函數是一等公民,函數可以作為函數的參數,函數也可以返回一個函數,因此適合函數式編程風格。 函數式編程 ( Functional Programming ) 是一種以函數為基礎的編程方式和代碼組織方式,從程序員的思路上來說,就是將程序拆分并抽象成多個函數,...

    oogh 評論0 收藏0
  • Python Metaclass 初探

    摘要:以我們的程序為例,就是以為產生了一個名為的新類型,改類型的實現由給出,而就包含了通過返回的這個方法。從中找到這些類并一一執行測試。 先以一個大牛的一段關于Python Metapgramming的著名的話來做開頭: Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder ...

    nidaye 評論0 收藏0
  • [python] 初探'函數式編程'

    摘要:前言繼續向下看廖大教程,看到了函數式編程這一節,當時是覺得沒啥用直接跳過了,這次準備要仔細看一遍了,并記錄下一些心得。 前言 繼續向下看廖大教程,看到了函數式編程這一節,當時是覺得沒啥用直接跳過了,這次準備要仔細看一遍了,并記錄下一些心得。 函數式編程 上學期有上一門叫 人工智能 的課,老師強行要我們學了一個叫做 prolog 的語言,哇那感覺確實難受,思維方式完全和之前學過的不一樣,...

    xcc3641 評論0 收藏0
  • 初探Linux---Linux文件系統概覽

    摘要:六文件類型與目錄結構支持很多文件類型,其中非常重要的文件類型有普通文件,目錄文件,鏈接文件,設備文件,管道文件,套接字文件等。套接字文件套接字文件被用于網絡進程之間的通信,既可以使臺不同的機器進行通信,也可以用于本機的網絡程序。一、Linux簡介類Unix系統: Linux是一種自由、開放源碼的類似Unix的操作系統Linux內核: 嚴格來說,Linux這個詞本身只表示Linux內核Linu...

    Tecode 評論0 收藏0

發表評論

0條評論

mcterry

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<