2016-09-09 3 views
0

모두가 나에게 합리적인 것처럼 보이지만 어떻게 든 내 변수가 비어있는 상태로 유지되기 때문에 이것이 범위 문제인지 확실하지 않습니다.내 변수가 비어있는 이유는 무엇입니까?

나는이 두 가지 유사한 코드를 리팩토링하고 기능을 추가하려고합니다. 코드가 내 요구에 완벽하게 작동하지만 리팩토링을 시도하면 변수가 계속 비어있게됩니다.

나를 도와 줄 수 있습니까?

이 내가 노력하고 도움을 사전에 빈 문자열을 나에게

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 

감사를 제공하고있는 리팩토링이다

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>"; 
    } 
}); 

잘 작동 내가 가지고있는 두 개의 유사한 코드입니다.

+0

가능한 중복 (http://stackoverflow.com/questions/17382427/are-there -pointers-in-javascript) –

답변

2

JavaScript는 값별 언어이므로 문자열은 사본으로 전달됩니다. 함수가 nameList 변수를 수정하면 두 번째 매개 변수로 전달한 문자열의 복사본을 수정합니다.

가 업데이트 된 문자열을 반환하도록 당신은 당신의 기능을 수정할 수 있습니다 : [? 자바 스크립트가 포인터]의

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

@vid "pass-by-value"라는 용어는 현대 개념의 객체보다 오래 되었기 때문에 혼란 스럽습니다. 실제 pass-by-reference 언어 (구 포트란과 같은)는 현대 프로그래머에게는 정말 이상한 것처럼 보입니다. Java와 JavaScript가 객체 참조를 전달하는 방식과 전혀 다릅니다. JavaScript의 객체도 값으로 전달됩니다. 객체의 "값"은 해당 객체에 대한 포인터가되고 해당 언어는 포인터를 전달하기 때문입니다. 그러나 그런 종류의 "참조"는 "참조에 의한 통과"라는 용어에서 단어의 의미가 아닙니다. – Pointy

+0

@Dora ** 두 가지 ** ** 일을 할 수 있는지 확인하십시오. 함수에 return 문을 추가하고 ** 변수에 반환 값을 다시 할당하십시오. – Pointy