По поводу неортодоксальности функции JavaScript - PullRequest
5 голосов
/ 26 января 2009

Я программирую для Интернета уже довольно давно, но только недавно обнаружил несколько новых тонкостей относительно использования функций и странных (или я так их считаю) вещей, которые вы можете делать с ними. Однако на данный момент они кажутся только синтаксически красивыми вещами. Я надеялся, что кто-то может просветить меня о том, как некоторые из этих недавно обнаруженных аспектов могут оказаться полезными.

Например, когда я впервые запустил это, я подумал, что оно не будет работать:

<script>
function x(q)
 {
q(x);
 }

x(function(a)
 {
alert(a);
 }
 );
</script>

Но это так! Каким-то образом создание именованной функции, которая получает другую анонимную функцию в качестве единственного параметра, а затем запускает функцию, переданную ей вместе с самой передачей в качестве параметра, работает просто отлично. Это положительно сказалось на моем сознании, и я почти уверен, что в этом есть что-то полезное, но я просто пока не могу это понять.

Ах, и еще одна вещь, которую я был в восторге: используя глобальную переменную для хранения функции, можно позже при выполнении использовать функцию eval () в JavaScript для изменения этой переменной, таким образом динамически изменяя внутреннюю работу функции. Пример:

<script>
var f = function()
 {
alert('old text');
 }

eval('f = ' + f.toString().replace('old text', 'new text'));

f();
</script>

Конечно, этот код предупреждает строку "новый текст"; когда я увидел это, мой разум снова был взорван, но также сразу же заинтригован возможностью создания чего-то невероятного.

Итак ... мой животрепещущий вопрос о переполнении стека: как можно использовать такие, казалось бы, абстрактные принципы кодирования каким-либо положительным образом?

Ответы [ 3 ]

5 голосов
/ 26 января 2009

В основном вы спрашиваете: Как я могу использовать функции в качестве первоклассных объектов?

Самое распространенное и распространенное использование - это замыкания (или анонимные функции) для обработки событий. Однако то, что вы можете быть умным, не означает, что вы должны это делать. Пишите ясный, читаемый код, как на любом другом языке.

Да, и набейся, набрав eval, и никогда не думай делать это снова

3 голосов
/ 26 января 2009

Первый, замыкания, очень распространены в javascript. Если вам нужны более продвинутые примеры, вот хорошая интерактивная игровая площадка, с которой вы можете поиграть: http://ejohn.org/apps/learn/.

Вот моя window.onload функция, которую я использую, когда все, над чем я работаю, не требует полноценной библиотеки.

//add events to occur on page load
window.addOnload = function(fn) {
    if (window.onload) {
        var old = window.onload;
        window.onload = function() {
            old();
            fn();
        }
    } else {
        window.onload = fn;
    }
}

Тогда, когда мне нужно, чтобы что-то происходило при загрузке, я могу просто использовать анонимную функцию. Вот пример из моего недавнего проекта по техническому обслуживанию.

//make all menu items have a hover property
window.addOnload(function(){
    var cells = document.getElementsByTagName('td');

    for (var i=0; i < cells.length; i++) {
        if (cells[i].className != 'NavMenuItem')        continue;

        (function(cell){
            cell.onmouseover = function() {
                cell.className = 'NavMenuItemHighlight';
            }
            cell.onmouseout = function() {
                cell.className = 'NavMenuItem';
            }
        })(cells[i])
    }
});

Что касается вашего второго «открытия», просто притворитесь, что вы никогда не узнали об этом.

0 голосов
/ 26 января 2009

Ну, первое, как правило, вы доказываете, что проблема остановки неразрешима ...

Считаете ли вы, что "полезный" целиком зависит от вас, я думаю B -)

...