javascript 在这段代码中,为了获得注解输出,一步一步地发生了什么?

4zcjmb1e  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(101)

userMsg = toUser(“Bob”)正在调用toUser(“Bob”)并将其赋值给userMsg,然后将其与name连接并赋值给greet。因此,我的大脑希望看到greet = toUser(“Bob”)+ name,这显然不是javascript正在做的。用户消息=消息?还是用户消息=到用户(“鲍勃”);
请你帮我弄明白为什么...

function giveMessage(message) {
    
       let userMsg = message;
        userMsg = toUser("Bob");
        return userMsg;
        function toUser(userName) {
            let name = userName;
            let greet = userMsg + name;
            return greet;
        }
        
    }
    console.log(giveMessage("The world says hello dear: "));
// The world says hello dear: Bob

和这个一样吗

function giveMessage(message) {
    
       let userMsg = message;
        let hello = toUser("Bob");
        return hello;
        function toUser(userName) {
            let name = userName;
            let greet = userMsg + name;
            return greet;
        }
        
    }
    console.log(giveMessage("The world says hello dear: "));
// The world says hello dear: Bob
k0pti3hp

k0pti3hp1#

下面是第一个用行号注解的代码片段:

function giveMessage(message) {                          // line 1
                                                         // line 2
   let userMsg = message;                                // line 3
    userMsg = toUser("Bob");                             // line 4
    return userMsg;                                      // line 5
    function toUser(userName) {                          // line 6
        let name = userName;                             // line 7
        let greet = userMsg + name;                      // line 8
        return greet;                                    // line 9
    }                                                    // line 10
                                                         // line 11
}                                                        // line 12
console.log(giveMessage("The world says hello dear: ")); // line 13

函数giveMessage是从第1行开始定义的,但只有在console.log()内部的第13行调用它时才会被调用。
调用时,执行步骤的顺序为:
1.执行第1行(将userMsg设置为message的值"The world says hello dear: "
1.开始执行第2行,计算赋值表达式的右侧(即调用函数toUser("Bob")
1.执行第7行(作为函数调用的一部分),并将name指定为userName的传入值"Bob"
1.执行第8行,将greet设置为userMsgname的连接值。请注意,userMsg仍然保留在步骤1中分配的值,因为我们仍然只计算第2行的右侧。这意味着greet被设置为"The world says hello dear: " + "Bob"
1.该函数返回greet的值,我们跳回到第2行以完成在步骤2中开始的赋值。现在我们设置userMsg并覆盖先前在其中设置的值,但该值已经在步骤4中使用过,因此我们没有丢失任何内容。
1.返回userMsg的新值。
第二个代码片段只是引入了一个新变量来保存toUser(...)调用的输出,对toUser(...)内部发生的事情没有任何影响。

jaxagkaj

jaxagkaj2#

@Ergwun已经给出了一个很好的答案。我想再增加一个Angular 来看待这个问题。你可以简单地将return替换为userMsg =来“内联”函数以获得等效函数。希望这有助于澄清你的疑问。

function giveMessage(message) {
  let userMsg = message;
  // userMsg = toUser("Bob");
  // "inline" the `toUser` function:
  { 
    let userName = "Bob"; // toUser(userName = "Bob")
    let name = userName;
    let greet = userMsg + name;
    userMsg = greet;      // return greet;
  }
  return userMsg;
}

console.log(giveMessage("The world says hello dear: "));

相关问题