Передача функции в качестве аргумента в Javascript

#javascript #function #arguments

#javascript #функция #аргументы

Вопрос:

Я действительно борюсь с этим — уверен, что я упускаю что-то простое.

Вот код :-

 function webcamupdate(webcamurl) {
    alert("I am a function to update the webcam with the url " webcamurl);
}

function countdown(callback) {
    alert(callback);
    setTimeout("callback()", 10000);
}

var theurl = "THIS IS THE URL";

countdown(function(){ webcamupdate(theurl); });
  

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

Все работает нормально, если функция не имеет аргументов, однако оповещение (обратный вызов) в функции countdown возвращает следующее :-

function(){ webcamupdate(theurl); }

Это, конечно, приводит к сбою скрипта, когда функция webcamupdate выполняется как «webcamurl», не определено.

Что на самом деле должно сказать оповещение (обратный вызов), так это :-

function(){ webcamupdate(«ЭТО URL»); }

т.е. он оценивает аргумент «theurl» ПЕРЕД передачей его с функцией.

Любые идеи были бы высоко оценены

Редактировать

Я думаю, что, возможно, я ввел вас в заблуждение, используя оповещение, а не функцию (я просто пытался упростить его!)

Вот исходный код (все еще сокращенный, но дающий вам представление получше).

 function webcamupdate(url) {
    document.getElementById("cruisecam").src=url "amp;rand=" Math.random();
    countdown(30,"Webcam",function(){ webcamupdate(url); });
}

function countdown(currentcount,displayelement,callback) {
    var displaytext;
    if (currentcount == 0 ) displaytext = displayelement " is refreshing now";
    else displaytext = displayelement " updating in " currentcount " seconds";
    if (trackingcountdown.hasChildNodes()) clearelement("trackingcountdown");
    trackingcountdown.appendChild(document.createTextNode(displaytext));
    if (currentcount == 0) {
        countdown(currentcount,displayelement,callback)
    }
    else {
        currentcount--;
        var countdownparameters=currentcount ',"' displayelement '",' callback;
        setTimeout("countdown(" countdownparameters ")", 1000);
    }
}

//The function is called on window loading with
//countdown(30,"Webcam",function(){ webcamupdate(url); });

//clearelement is another function (not listed) that clears the node.
  

По сути, важна функция обратного отсчета — она принимает 3 аргумента — время обратного отсчета в секундах, элемент DOM для отображения обратного отсчета и функцию для запуска по таймауту.

Если третий аргумент (функция) не имеет собственных аргументов — например, webcam() — он работает нормально, однако, когда мы пытаемся добавить webcam («webcampic.jpg «) это не работает из-за того, что функция пытается запустить webcam (url), а не webcam(«webcampic.jpg «).

Очевидно, что самое простое решение — просто сделать URL глобальной переменной, но это не очень хорошая практика и помешало бы мне использовать код обратного отсчета на других страницах через js-файл. помогите!

Комментарии:

1. «Какое оповещение (обратный вызов) на самом деле должно сказать …» JavaScript работает не так.

2. Итак, что должно сказать предупреждение, когда все сказано и сделано?

Ответ №1:

Для этого достаточно просто перейти от callback() к передаче ссылки на функцию.

 function webcamupdate(webcamurl) {
    alert("I am a function to update the webcam with the url " webcamurl);
}

function countdown(callback) {
    alert(callback);
    setTimeout(callback, 10000);
}

var theurl = "THIS IS THE URL";

countdown(function(){ webcamupdate(theurl); });
  

Ответ №2:

 var theURL = "THIS IS THE URL";

function webCamUrlUpdate( url ) {
    alert( "I am a function to update the webcam with the url "   url );
}

function countDown( callback ) {
    setTimeout( callback, 10000 );
    alert( callback );
}

countDown(function () {
    /* IMPORTANT: need to return that other function */
    return webCamUrlUpdate( theURL );
});
  

На самом деле вы хотели бы вернуть функцию, чтобы она setTimeout( callback, 10000 ); вела себя так, как ожидалось. Когда вы оповещаете функцию в Javascript, это то же самое, что alert(callback.toString()) получить полную строковую версию заголовка и тела функции.

http://jsfiddle.net/btleffler/xJ5uw/

Достаточно интересно, что если вы предупредите об обратном вызове перед setTimeout() , не похоже, что обратный вызов когда-либо срабатывает. Если вы закомментируете первое предупреждение или оповещение после установки тайм-аута, оно работает просто отлично. Я тестировал ее только в Chrome, так что, полагаю, мне нужно провести еще несколько исследований.

В любом случае, вы не можете заставить javascript анализировать (или обрабатывать или что-то еще) параметр функции до фактического вызова функции. Хотя вы могли бы просто использовать анонимный обратный вызов в countDown() предупреждении URL-адреса самостоятельно.

Комментарии:

1. Спасибо, ребята — я посмотрю на это в выходные. Однако я думаю, что, возможно, я слишком упростил пример и ввел вас в заблуждение — я посмотрю, можно ли добавить немного больше моего кода для дальнейшего объяснения.

Ответ №3:

Хорошо, ребята — я, наконец, решил это сам -, вот решение для других.

Сначала создайте функцию, которая возвращает функцию:

 function createfunctionwebcamupdate(url) {
    return function(){ webcamupdate(url); };
}
  

Затем установите переменную для запуска функции при ее вызове:

 webcamupdatefunction = createfunctionwebcamupdate(url);
  

Затем обратитесь к этой новой переменной как к функции обратного вызова:

 function(){ webcamupdatefunction(); }
  

Javascript, по-видимому, запоминает переменную, сохраненную в createfunction части, при вызове переменной.

Надеюсь, это поможет.