#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
части, при вызове переменной.
Надеюсь, это поможет.