Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.12.2012, 18:30
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Функция-обертка как альтернатива глобальным переменным
Всем привет. Вопрос такой. Можно ли использовать анонимную функцию-обертку, чтобы избежать объявления глобальных переменных? Я поместил в эту функцию абсолютно весь код. Раньше я использовал в своем коде глобальные переменные, но почитав в сети негативные отзывы о них, решил найти способ избежать их использование.
Дело в том, что в моем коде все функции пользуются общими переменными. Я пытался обернуть в эту функцию только часть кода, но тогда другие функции переставали работать. Даже передавал аргументы в вызываемую функцию, но увы. Пришлось оборачивать в обертку весь код. Другого выхода я не нашел. Вот код с глобальными переменными:
var Data; var i = 0; var y = 0;
function button(x) {
if(x==1) {
if(i!=y) {
$('#here' + i).css("display", "none");
i++;
$('#here' + i).css("display", "block");
}
else {
$('#here' + i).css("display", "none");
i++; y++;
go();
$('#back').css("display", "inline-block");
}
}
else if(x==2){
if(i>0) {
$('#here'+ i +',#send').css("display", "none");
i--;
$('#here' + i).css("display", "block");
}
else {
return false;
}
}
console.log("i="+i,"y="+y);
}

function sending() {
var str = $("input:radio[class=server]").serialize();
str += "&test_id="+Data[0].id;
$.get('save_data.php?'+str,
function(data2){
if(data2) {
console.log(data2);
}
});
}

function go() {
if(i > Data.length - 1) {
$('#send').css("display", "inline-block");
y--;
return false;
}
var row = '';
row = '<span class="test" id="here'+i+'">';
row += '<b>' + Data[i].questions + '</b><Br>';
var ss = Data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" class="server" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
row += '</span>'
$('#load_test').prepend(row);
}

$(document).ready(function(){
$('a').live('click', function() {
$('div#block3').css("display", "none");
var href = $(this).attr("id");
$.post('load_data.php', {drink: href},
function(data){
Data = data;
if(data) {
var fieldsCount = data.length;
var row = '';
if(fieldsCount) {
row = '<form id="load_test"><button onclick="button(1); return false;">Далее</button>';
row += '<button id="back" style="display: none" onclick="button(2); return false;">Назад</button>';
row += '<button id="send" style="display: none" onclick="sending(); return false;">Отправить</button></form>';
$('#feeds').html(row);
go();
}
}
  }, "json"); 
return false;
});
});

А вот код с анонимной функцией оберткой:
$(document).ready(function(){
(function(){
var Data; var i = 0; var y = 0;
$('a').live('click', function() {
$('div#block3').css("display", "none");
var href = $(this).attr("id");
alert(href);
$.post('load_data.php', {drink: href},
function(data){
Data = data;
if(data) {
var fieldsCount = data.length;
var row = '';
if(fieldsCount) {
row = '<form id="load_test"><input id="forward" type="image" src="images/forward.png">';
row += '<input type="image" src="images/to_back.png" id="back" style="display: none">';
row += '<button id="send" style="display: none">Отправить</button></form>';
$('#feeds').html(row);
go();
}
}
  }, "json");
return false;
});
$('#forward').live('click', function(){
if(i!=y) {
$('#here' + i).css("display", "none");
i++;
$('#here' + i).css("display", "block");
}
else {
$('#here' + i).css("display", "none");
i++; y++;
go();
$('#back').css("display", "inline-block");
}
console.log("i="+i,"y="+y);
return false;
});
$('#back').live('click', function(){
if(i>0) {
$('#here'+ i +',#send').css("display", "none");
i--;
$('#here' + i).css("display", "block");
}
console.log("i="+i,"y="+y);
return false;
});

function go() {
if(i > Data.length - 1) {
$('#send').css("display", "inline-block");
y--;
return false;
}
var row = '';
row = '<span class="test" id="here'+i+'">';
row += '<b>' + Data[i].questions + '</b><Br>';
var ss = Data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" class="server" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
row += '</span>'
$('#load_test').prepend(row);
}

$('#send').live('click', function(){
var str = $("input:radio[class=server]").serialize();
str += "&test_id="+Data[0].id;
$.get('save_data.php?'+str,
function(data2){
if(data2) {
console.log(data2);
}
});
});

})();//конец обертки
});

Что скажете? Какой код лучше? И есть ли смысл вообще использовать обертку в моем случае? Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 11.12.2012, 18:39
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

Dimaz,

Надо было добавить весь код в обертку:
(function () {
//твой код
})();
Но ты зачем-то вешаешь анонимную функцию на document.ready и в ней оборачиваешь.
Ответить с цитированием
  #3 (permalink)  
Старый 11.12.2012, 18:45
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Сообщение от Hoshinokoe Посмотреть сообщение
Dimaz,

Надо было добавить весь код в обертку:
(function () {
//твой код
})();
Но ты зачем-то вешаешь анонимную функцию на document.ready и в ней оборачиваешь.
Хорошо, исправим. Ну так в общем я правильно сделал? По другому же никак?
Ответить с цитированием
  #4 (permalink)  
Старый 11.12.2012, 22:12
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

Dimaz,

Но если ты хочешь все вызвать на document.ready:
$(document).ready(function(){ // это уже есть анонимная функция
// тут код
});
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
какая функция, определяет как расположенно фото, горизонтально или вертикально? FirstFrost Общие вопросы Javascript 6 15.07.2010 15:19
Как вызывается функция? Мараторий Общие вопросы Javascript 3 22.01.2010 13:18
В качестве параметра функции другая функция, как? Sintez Я не знаю javascript 13 11.06.2009 11:10
Как узнать, завершила ли свою работу рекурсивная функция Ajax Общие вопросы Javascript 4 13.05.2009 14:50