为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

至尊宝的传说 2018-08-10 13:29:50
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;请各位指点一下, 谢谢!
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

自执行或者立即调用的函数表达式
简单理解,第一,函数加括弧()表示一个表达式,有两种写法都可以(对于达到的效果没什么区别):

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

其实,很多书上有些,只要你让解析器认为这是一个表达式,那么都会执行,比如一元操作符:

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

关于replace第二个参数是函数
推荐读一下官方文档。
首先,这个方法的参数是没有固定个数的,不过有一定规则

  • 第一个参数是每次正则匹配到的字符串,这个是固定的。上面的a就是每次正则匹配到的

  • 后续是捕获组匹配到的内容,子表达式。上面的b 就是前面正则括弧里面的内容

  • 接下来是 匹配字符串开始的下标索引index

  • 再接下里是源字符串


查看完整回答
反对 回复 2018-08-12
  • 1 回答
  • 0 关注
  • 577 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信