我正在研究新手训练营问题集。以下问题要求我们根据顾客光顾餐厅的次数来编写回复代码。一个对象包含客户名称和访问次数。该函数已传递了'customerName'参数,但尚未声明customerName。我很困惑为什么没有将对象'customerData'传递给函数,而是传递了实际的键'客户的名字'。代码如下:
/*Write a function called "greetCustomer".
*
*Given a name, "greetCustomer" returns a greeting based on how many times that
*customer has visited the restaurant. Please refer to the customerData object.
*/
var customerData = {
'Joe': {visits: 1 },
'Carol': {visits: 2 },
'Howard': {visits: 3, },
'Carrie': {visits: 4 }
};
var greetCustomer = function(customerName) {
for (var customer in customerData) {
if (customer === customerName) {
return 'Hello '+ customer + ', welcome back for visit #' + (customerData[customer].visits + 1) + '!';
}
}
return undefined;
};
greetCustomer('Carrie');
答案 0 :(得分:0)
customerName
是一个占位符,在此示例中为'Carrie'
。该值在调用greetCustomer函数时传递。换句话说,整个函数var greetCustomer
在定义时会保存在内存中-并且该函数知道它可能已经传入了一个参数customerName
。基于运行此函数的位置,您可以甚至执行console.log(greetCustomer)来查看实际功能及其保存方式。
要解释所发生的全部情况:
for..in
循环的customerData对象。 undefined
答案 1 :(得分:0)
较不冗长的解释是:
每次调用该函数时,其参数都会保留您传递的值或其他未定义的值
另一个问题是范围问题。当您使用var声明customerData时,最接近的封闭函数(或全局范围)内的所有内容都可以引用它。.知道如何操作范围是很好的:
library(tidyverse)
NAinds <- is.na(df2$y2)
df1[!NAinds,] %>%
left_join(df2, by = c("x" = "x2", "y" = "y2")) %>%
bind_rows(df1[NAinds, ] %>%
left_join(df2, by = c("x" = "x2")) %>%
mutate(y = coalesce(y, y2)) %>%
select(-y2))
# x y z
# <chr> <chr> <chr>
#1 City Table1 b
#2 City Table2 c
#3 Name Table5 a
(无)//父范围
我希望这对您有帮助