函数如何接受未声明的变量作为参数?

时间:2018-10-10 00:49:45

标签: javascript function object

我正在研究新手训练营问题集。以下问题要求我们根据顾客光顾餐厅的次数来编写回复代码。一个对象包含客户名称和访问次数。该函数已传递了'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');

2 个答案:

答案 0 :(得分:0)

customerName是一个占位符,在此示例中为'Carrie'。该值在调用greetCustomer函数时传递。换句话说,整个函数var greetCustomer在定义时会保存在内存中-并且该函数知道它可能已经传入了一个参数customerName。基于运行此函数的位置,您可以甚至执行console.log(greetCustomer)来查看实际功能及其保存方式。

要解释所发生的全部情况:

  1. customerData对象保存在内存中,并将通过 参考。
  2. greetCustomer函数保存在内存中。函数也是JavaScript中的对象,因此将通过引用传递。
  3. 调用greetCustomer函数并传递值'Carrie'。
  4. 值“ Carrie”传递到保存在内存中的greetCustomer函数中,然后在其中循环浏览键中的每个键 使用for..in循环的customerData对象。
  5. 如果该键(名称)等于customerName的传入值,则该函数返回问候语。
  6. 如果在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  

(无)//父范围

我希望这对您有帮助

相关问题