Как я могу избавиться от этой функции, вызывающей себя? - PullRequest
1 голос
/ 23 марта 2012

Я нашел этот удивительный фрагмент в интернете:

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}

Я хотел бы передать его до 140 байт, но эта функция вызывает сама себя, что означает, что она загрязняет глобальное пространство имен переменной (f)

Как можноЯ изменил его, чтобы он не вызывал сам себя?

Вот jsfiddle: http://jsfiddle.net/vCkew/

Ответы [ 2 ]

0 голосов
/ 23 марта 2012

Вы можете использовать ключевое слово 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'));​

ПРИМЕЧАНИЕ. Это действительно отвечает на ваш вопрос, заставляя функцию не вызывать себя, но она удаляет функцию из глобального пространства имен.

0 голосов
/ 23 марта 2012

Используйте некоторую область видимости:

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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...