簡體   English   中英

Javascript:哪些參數傳遞給函數?

[英]Javascript: What parameters are being passed to function?

我試圖將我的大腦包裹在封閉處。 我一直在閱讀Javascript:The Good Parts,作者介紹了以下代碼片段,用於向String對象添加“ deentityify”方法,該想法是對HTML編碼符號進行解碼:

// the method method:
Function.prototype.method = function(name, func) {
        if (! this.prototype[name]) {
                this.prototype[name] = func;
                return this;
        }
}

String.method('deentityify', function() {

        // entity table: maps entity names
        // to characters:
        var entity = {
                quot: '"',
                lt: '<',
                gt: '>',
        };

        // Return the deentityify method:
        return function() {
                return this.replace(/&([^&;]+);/g,
                        // What are a & b, how are they getting passed?!
                        function (a, b) {
                                //  console.log added by me, unsuccessfully:
                                console.log('a = ' + a);
                                console.log('b = ' + b);
                                var r = entity[b];
                                return typeof r === 'string' ? r : a;
                        }
                );
        };
}());

因此,我了解這里發生的大多數事情,除了實際參數傳遞給定義為String.replace的第二個參數的函數。 如何定義“ a”和“ b”?

直接調用“'.deentityify()沒有明確傳遞任何參數,因此它們是如何定義的?作為一個次要的問題,為什么CONSOLE.LOG()用於記錄的值不能工作和b?有什么辦法我能否成功記錄此類變量?

謝謝您的幫助。

編輯:最后一句話以前沒有' not ',因此含義不清楚。

.replace()函數可以將函數作為第二個參數來調用。 這樣做時,將在正則表達式成功匹配從匹配過程中提取的參數之后調用該函數。

第一個參數始終是源字符串的整個匹配部分。 后續參數表示來自正則表達式的“捕獲組”。

在這種情況下,正則表達式為/&([^&;]+);/g 該字符與“&”號匹配,后跟“&”或分號以外的任意數量的字符,后跟一個分號。 前導“與”號和尾隨的分號之間的字符被“捕獲”,因為正則表達式的該部分帶有括號。

因此,如果源字符串是

Hello &mdash; world!

然后匹配該正則表達式(一次)將產生:

  • &mdash; 作為整體匹配字符串
  • mdash作為第一個(在這種情況下,也是唯一一個)捕獲組的值。

從而:

"Hello &mdash; world!".replace(/&([^&;]+);/g, function(all, group) {
  alert("entire match: " + all + " group: " + group);
});

會根據我上面列出的內容顯示一條消息。

現在,最重要的是,問題中的代碼涉及另一層有趣的行為。 實際上傳遞給method()函數的函數不是那個大的外部函數,而是從該函數返回的函數。 該返回的函數希望被調用,使得this是一個String實例; 否則,對this.replace()的調用將無法工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM