2016-09-09 7 views
0

Я не уверен, что это проблема с областью видимости, потому что все мне кажется разумным, но почему-то моя переменная продолжает возвращаться пустым.моя переменная возвращается пустым почему?

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

Может кто-нибудь, пожалуйста, дайте мне руку?

Это две аналогичных код я имею, который работает отлично

var productOutOfStock = ""; 
$(".availability.outofstock").each(function(){ 
    var outOfStockMsg = $(this).text(); 
    var name = $(this).closest(".basket-items").find(".product-name").text(); 
    if(outOfStockMsg != ""){ 
     productOutOfStock += name + "<br>"; 
    } 
}); 

var productOffline = ""; 
$(".availability.instock").each(function(){ 
    var outOfStockMsg = $(this).text(); 
    var name = $(this).closest(".basket-items").find(".product-name").text(); 
    if(outOfStockMsg != ""){ 
     productOffline += name + "<br>"; 
    } 
}); 

Это рефакторинг я пытаюсь и дать мне пустую строку

var productOutOfStock = ""; 
var productOffline = ""; 

function getProductNames(offOrNostock, nameList){ 
    offOrNostock.each(function(){ 
     var message = $(this).text(); 
     var productName = $(this).closest(".basket-items").find(".product-name").text(); 
     if(message != ""){ 
      nameList += productName + "<br>"; 
     } 
    }); 
    console.log(nameList); //this does show the names 
} 

getProductNames($(".availability.outofstock"), productOutOfStock); 
getProductNames($(".availability.instock"), productOffline); 
console.log(productOutOfStock); //this is giving me empty string 

Заранее спасибо за любую помощь.

+0

Возможный дубликат (http://stackoverflow.com/questions/17382427/are-there -pointers-in-javascript) –

ответ

2

JavaScript - это язык с перекрестными знаками, поэтому ваши строки передаются как копии. Когда функция изменяет переменную nameList, она модифицирует копию строки, которую вы передаете, в качестве второго параметра.

Вы можете изменить вашу функцию так, что она возвращает обновленную строку: [? Есть указатели в JavaScript]

function getProductNames(offOrNostock, nameList){ 
    offOrNostock.each(function(){ 
     var message = $(this).text(); 
     var productName = $(this).closest(".basket-items").find(".product-name").text(); 
     if(message != ""){ 
      nameList += productName + "<br>"; 
     } 
    }); 
    return nameList; 
} 

productOutOfStock = getProductNames($(".availability.outofstock"), productOutOfStock); 
+1

Это пропускная способность для большинства вещей, но массивы и объекты, которые передаются по ссылке. Что-то, что меня задержало больше времени, чем я хотел бы признать. – vlaz

+1

@ Ввиду того, что термин «пропуск-значение» запутан, потому что он старше современной концепции объектов. Фактические языки с перекрестными ссылками (например, старый Fortran) кажутся действительно странными для современных программистов; это совсем не то же самое, что способ передачи ссылок на объекты Java и JavaScript. Объекты в JavaScript также передаются по значению, потому что «значение», которое является объектом, является указателем на этот объект, а язык передает указатель. Однако такая «ссылка» не означает, что это слово означает термин «перекрестная ссылка». – Pointy

+0

@Dora убедитесь, что вы делаете ** две вещи: добавьте это выражение 'return' к функции, ** и ** присвойте возвращаемое значение обратно в переменную. – Pointy

Смежные вопросы