什么是函数(a,b)的值?

时间:2012-10-27 07:21:16

标签: javascript concept

我正在测试JavaScript的模块示例:好的部分。我不知道谁在a和b中传入了函数(a,b)。不知怎的,它有效。

Function.prototype.method = function(name, f) {
    this.prototype[name] = f;
    return this;
}
String.method('de', function() {
    var entity = {
        lt : '<',
        gt : '>'
    };
    return function() {
        return this.replace(/&([^&;]+);/g, function(a, b) {
            document.write("<br> a=" + a + " b=" + b);
            var r = entity[b];
            return typeof r === 'string' ? r : a;
        });
    };
}());
document.write("<br>" + '&lt;&gt'.de());

1 个答案:

答案 0 :(得分:1)

要了解发生的事情,必须非常仔细地了解实际发生的事情。

Function.prototype.method = function(name, f) {
    this.prototype[name] = f;
    return this;
}

这部分很清楚,它是扩展任何对象Prototype的“捷径”。

神奇发生在代码的第二部分,先前定义的函数提供了一个自执行函数作为第二个参数!

String.method('de', function() {
    var entity = {
        lt : '<',
        gt : '>'
    };
    return function() {
        return this.replace(/&([^&;]+);/g, function(a, b) {
            // "this" will refer to the object the function is bound to.
            document.write("<br> a=" + a + " b=" + b);
            var r = entity[b];
            return typeof r === 'string' ? r : a;
        });
    };
}()); <-- The magic happens here!

这意味着,JavaScript解释器将使用“第一内部”函数(直接提供给String.method的函数)的返回值作为实际函数,因为“第一内部”函数在分配之前执行到String.prototype

下面的代码执行相同的操作,但在本地范围内添加了一个变量(de)。上述方法不会污染范围,这是实现这一目标的更优雅方式。您甚至可以将entity放在本地范围内进一步展开。

var de = function() {
    var entity = {
        lt : '<',
        gt : '>'
    };
    return function() {
        return this.replace(/&([^&;]+);/g, function(a, b) {
            // "this" will refer to the object the function is bound to.
            document.write("<br> a=" + a + " b=" + b);
            var r = entity[b];
            return typeof r === 'string' ? r : a;
        });
    };
};
String.method('de', de());

现在问你关于ab如何发挥作用的问题! 这与String.replace在传递的第二个参数是函数时的行为有关。评论中提供的link DCoder解释了这个非常好!参数a是整个匹配的子字符串,b是第一个匹配的“带括号的子匹配”。