猿问

我在蝴蝶书上遇到的问题,关于函数的立即执行

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;    return this;
};
String.method('deentityify', function() {  //请问这个函数时怎么立即执行的
    var entity = {        quot: '"',        lt: '<',        gt: '>'
    };    return function() {        return this.replace(/&([^&;]+);/g,                            function(a, b) { //replace 传给函数的不是三个参数么这两个代表什么?
            var r = entity[b];            return typeof r === 'string' ? r : a;
        });
    };
}());  //标记

蝴蝶书上看到第四章模块一节遇到的问题, 这个函数不是匿名函数么,按我的理解应该在function函数体外加个括号啊,向这样

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

这也能执行, 结果也一样, 但是有什么不同么?
对于没加括号的函数是不是这样,它在执行下面这一句时执行, 这样的话就是函数表达式,也就不需要括号了。

this.prototype[name] = func;

请各位指点一下, 谢谢!


至尊宝的传说
浏览 578回答 1
1回答

慕勒3428872

自执行或者立即调用的函数表达式简单理解,第一,函数加括弧()表示一个表达式,有两种写法都可以(对于达到的效果没什么区别)://&nbsp;第一种(function&nbsp;()&nbsp;{&nbsp;/*&nbsp;code&nbsp;*/&nbsp;}&nbsp;());&nbsp;&nbsp; //&nbsp;第二种(function&nbsp;()&nbsp;{&nbsp;/*&nbsp;code&nbsp;*/&nbsp;})();其实,很多书上有些,只要你让解析器认为这是一个表达式,那么都会执行,比如一元操作符:+function&nbsp;()&nbsp;{&nbsp;/*&nbsp;code&nbsp;*/&nbsp;}&nbsp;(); -function&nbsp;()&nbsp;{&nbsp;/*&nbsp;code&nbsp;*/&nbsp;}&nbsp;(); !function&nbsp;()&nbsp;{&nbsp;/*&nbsp;code&nbsp;*/&nbsp;}&nbsp;(); ~function&nbsp;()&nbsp;{&nbsp;/*&nbsp;code&nbsp;*/&nbsp;}&nbsp;();关于replace第二个参数是函数推荐读一下官方文档。首先,这个方法的参数是没有固定个数的,不过有一定规则第一个参数是每次正则匹配到的字符串,这个是固定的。上面的a就是每次正则匹配到的后续是捕获组匹配到的内容,子表达式。上面的b 就是前面正则括弧里面的内容接下来是 匹配字符串开始的下标索引index再接下里是源字符串
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答