在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 我在蝴蝶書上遇到的問題,關(guān)于函數(shù)的立即執(zhí)行

我在蝴蝶書上遇到的問題,關(guān)于函數(shù)的立即執(zhí)行

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};
String.method('deentityify', function() {  //請問這個函數(shù)時怎么立即執(zhí)行的
    var entity = {
        quot: '"',
        lt: '<',
        gt: '>'
    };
    return function() {
        return this.replace(/&([^&;]+);/g,
                            function(a, b) { //replace 傳給函數(shù)的不是三個參數(shù)么這兩個代表什么?
            var r = entity[b];
            return typeof r === 'string' ? r : a;
        });
    };
}());  //標(biāo)記

蝴蝶書上看到第四章模塊一節(jié)遇到的問題, 這個函數(shù)不是匿名函數(shù)么,按我的理解應(yīng)該在function函數(shù)體外加個括號啊,向這樣

String.method('deentityify', (function() {  //標(biāo)記
    var entity = {
        quot: '"',
        lt: '<',
        gt: '>'
    };
    return function() {
        return this.replace(/&([^&;]+);/g,
                            function(a, b) {
            var r = entity[b];
            return typeof r === 'string' ? r : a;
        });
    };
})());  //標(biāo)記

這也能執(zhí)行, 結(jié)果也一樣, 但是有什么不同么?
對于沒加括號的函數(shù)是不是這樣,它在執(zhí)行下面這一句時執(zhí)行, 這樣的話就是函數(shù)表達(dá)式,也就不需要括號了。

this.prototype[name] = func;

請各位指點(diǎn)一下, 謝謝!

回答
編輯回答
巴扎嘿

自執(zhí)行或者立即調(diào)用的函數(shù)表達(dá)式
簡單理解,第一,函數(shù)加括?。ǎ┍硎疽粋€表達(dá)式,有兩種寫法都可以(對于達(dá)到的效果沒什么區(qū)別):

// 第一種
(function () { /* code */ } ());  
// 第二種
(function () { /* code */ })();

其實(shí),很多書上有些,只要你讓解析器認(rèn)為這是一個表達(dá)式,那么都會執(zhí)行,比如一元操作符:

+function () { /* code */ } ();
-function () { /* code */ } ();
!function () { /* code */ } ();
~function () { /* code */ } ();

關(guān)于replace第二個參數(shù)是函數(shù)
推薦讀一下官方文檔。
首先,這個方法的參數(shù)是沒有固定個數(shù)的,不過有一定規(guī)則

  • 第一個參數(shù)是每次正則匹配到的字符串,這個是固定的。上面的a就是每次正則匹配到的
  • 后續(xù)是捕獲組匹配到的內(nèi)容,子表達(dá)式。上面的b 就是前面正則括弧里面的內(nèi)容
  • 接下來是 匹配字符串開始的下標(biāo)索引index
  • 再接下里是源字符串
2017年3月17日 04:12
編輯回答
我以為

沒加括號的這個屬于函數(shù)表達(dá)式,不過它賦值之前已經(jīng)執(zhí)行過了

this.prototype[name] = func;
// 這里的func 已經(jīng)是 
function() {
    return this.replace(/&([^&;]+);/g,
                        function(a, b) {
        var r = entity[b];
        return typeof r === 'string' ? r : a;
    });
};

clipboard.png
你看下上述圖片,是一個效果。 平常寫(function(){...})()的形式是防止瀏覽器解析出錯,直接function(){...}()這么去運(yùn)行肯定報錯,瀏覽器以為你是在定義方法。但是置于參數(shù)中或者前面加了別的符號,讓瀏覽器以為是表達(dá)式就會直接執(zhí)行了

2017年6月26日 15:14