2017-02-22 90 views
0

編輯:添加的對象if語句和範圍在javascript

我在與這似乎消失了從函數返回的變量之前函數體內聲明的變量的問題:

var customerData = { 
    'Joe': { 
    visits: 1 
    }, 
    'Carol': { 
    visits: 2 
    }, 
    'Howard': { 
    visits: 3, 
    }, 
    'Carrie': { 
    visits: 4 
    } 
}; 

function greetCustomer(firstName) { 
    var greeting = ''; 

    for(var key in customerData){ 
    if(key === firstName){ 
     if(customerData[key]['visits'] === 1){ 
     greeting = "Welcome back, " + firstName + "! We're glad you liked us the first time!"; 
     console.log(greeting); // here to illustrate issue 
     } 
     else if(customerData[key]['visits'] > 1){ 
     greeting = "Welcome back, " + firstName + "! So glad to see you again!"; 
     console.log(greeting); 
     } 
    } 
    else{ 
     greeting = "Welcome! Is this your first time?" 
    } 
    } 

    return greeting; 
} 
greetCustomer("Joe"); 

和輸出:

Welcome back, Joe! We're glad you liked us the first time! // here is the correct greeting from the console output 
=> 'Welcome! Is this your first time?' // this is what I got 
Welcome back, Carol! So glad to see you again! // correct output again 
=> 'Welcome! Is this your first time? // base case again. 

不宜greeting可見整個功能的獲取其值以進行分配?我知道,我可以回到分支的問候,但我不確定我在這裏看到什麼,但我希望有人能解釋。謝謝。

+2

您的輸出是不明確!請解釋更多!你能指望什麼? –

+1

您正在循環訪問數據,每次迭代都會向'greeting'變量寫入內容。只返回上一次迭代中設置的值。 – JJJ

+1

該變量在整個函數中都是絕對可見的。您的錯誤在其他地方 – artemisian

回答

1

您的代碼遍歷customerData對象中的可用鍵。當它看到一個匹配firstName的密鑰時,它將分配給greeting並記錄它。

然後繼續遍歷其它鍵;如果下一個密鑰不匹配firstName(它可能不會),greeting分配"Welcome! Is this your first time?"。該值最終從函數返回。當firstName碰巧是customerData中的最後一個鍵時,那麼您的代碼將正常工作,否則greeting將被重新分配爲默認值。

所以基本的問題是你的代碼在找到並處理目標值後繼續處理,並重新分配greetings字符串。 greeting變量的範圍或可見性沒有問題 - 它是函數greetCustomer的局部變量。

解決此問題的一種方法是在分配問候語後立即返回(如您已經注意到的)。另一種方法是使用break退出for循環。然後greeting將在函數結束時返回。

function greetCustomer(firstName) { 
    var greeting = ''; 

    for(var key in customerData){ 
    if(key === firstName){ 
     if(customerData[key]['visits'] === 1){ 
     greeting = "Welcome back, " + firstName + "! We're glad you liked us the first time!"; 
     console.log(greeting); // here to illustrate issue 
     } 
     else if(customerData[key]['visits'] > 1){ 
     greeting = "Welcome back, " + firstName + "! So glad to see you again!"; 
     console.log(greeting); 
     } 
     break; // customer name found and appropriate greeting set, exit loop 
    } 
    else{ 
     greeting = "Welcome! Is this your first time?" 
    } 
    } 

    return greeting; 
} 
1

對於成功條件立即返回問候語而不是將其分配給greeting變量。但是,對於firstname不是customerData中的密鑰之一的情況,只需將greeting設置爲"Welcome! Is this your first time?" &,讓迭代繼續尋找`firstname。

你的代碼改成這樣[TESTED]:

function greetCustomer(firstName) { 
var greeting = ''; 

for(var key in customerData){ 
    if(key === firstName){ 
    if(customerData[key]['visits'] === 1){ 
     return("Welcome back, " + firstName + "! We're glad you liked us the first time!"); 
     console.log(greeting); // here to illustrate issue 
    } 
    else if(customerData[key]['visits'] > 1){ 
     return("Welcome back, " + firstName + "! So glad to see you again!"); 
    } 
    } 
    else{ 
    greeting = "Welcome! Is this your first time?"; 
    } 
} 
return greeting; 
} 
console.log(greetCustomer("Joe"));