我怎样才能摆脱这种自我调用功能?

时间:2012-03-23 14:09:45

标签: javascript global-variables

我在互联网上找到了这个很棒的片段:

function f(a,b,c,d){for(d?d=b.toUpperCase():b=4;!d&&b--;d=(d=d.replace(/-(.)/g,f))in(new Image).style&&d)d=[['Moz-','Webkit-','Ms-','O-'][b]]+a;return d}

它采用css属性的名称,并自动添加正确的供应商前缀。

我把它打了一小块以使其变小:

function f(a,b,c){for(c?c=b.toUpperCase():b=4;!c&&b--;c=(c=c.replace(/-(.)/,f))in(new Image).style&&c)c=["Moz-","Webkit-","Ms-","O-"][b]+a;return c}

我想将它提交到140bytes,但是这个函数调用自身,这意味着它用变量(f)污染全局命名空间

如何更改它以便它不会自行调用?

这是一个jsfiddle:http://jsfiddle.net/vCkew/

2 个答案:

答案 0 :(得分:0)

使用一些范围界定:

var myFunction = function(a, b, c) {
    var f = function(a, b, c) {
        for (c ? c = b.toUpperCase() : b = 4; !c && b--; c = (c = c.replace(/-(.)/, f)) in (new Image).style && c)
        c = ["Moz-", "Webkit-", "Ms-", "O-"][b] + a;
        return c;
    }
    return f(a, b, c);
}

http://jsfiddle.net/maniator/vCkew/3/

答案 1 :(得分:0)

您可以使用arguments关键字来获取该功能:

function(a,b,c){for(c?c=b.toUpperCase():b=4;!c&&b--;c=(c=c.replace(/-(.)/,arguments.callee))in(new Image).style&&c)c=["Moz-","Webkit-","Ms-","O-"][b]+a;return c}

让它在你的jsfiddle中起作用:

document.write((function(a,b,c){for(c?c=b.toUpperCase():b=4;!c&&b--;c=(c=c.replace(/-(.)/,arguments.callee))in(new Image).style&&c)c=["Moz-","Webkit-","Ms-","O-"][b]+a;return c})('transition'));​

注意:这实际上回答了你的问题,使函数不调用自身,但它确实从全局命名空间中删除了函数。