需要帮助来了解这种情况

时间:2017-09-15 08:52:37

标签: javascript function

function doSomething(a) {
    b = a + doSomethingElse(a * 2);
    console.log(b * 3);
}

function doSomethingElse(a) {
    return a - 1;
}

var b;

doSomething(2); //15

我不明白为什么结果是15;有人可以向我解释在这种情况下我该怎么想?

5 个答案:

答案 0 :(得分:6)

使用参数4(a * 2)调用

doSomethingElse()。它返回3.(3 + 2)* 3 = 15

function doSomething(a) {   
      b = a + doSomethingElse(a * 2);
      console.log('params of a', a, doSomethingElse(a*2));
      console.log(b * 3); 
}

function doSomethingElse(a) {   
      console.log('params b', a);
      return a - 1;  
}

var b;

doSomething(2); //15

答案 1 :(得分:4)

  

有人可以向我解释在这种情况下我该怎么想?

最好的方法是使用IDE内置的调试器和/或浏览器内置的调试器。将代码放在页面中,在最后的doSomething(2)调用上放置断点,然后逐步执行代码,随时查看ab的值。使用调试器是早期学习的基本技能,而不是高级技能。

这里发生的事情是:

  • b是全局声明的(并且最初具有值undefined),因为var声明在范围内的任何其他声明之前处理(有时称为“提升”)。 / LI>
  • doSomething(2)被召唤。
  • 它会调用doSomethingElse(a * 2),其中a2
  • doSomethingElse返回3,因为a - 1 4 - 13
  • 在调用3的地方使用doSomethingElse,因此包含该调用的行有效b = a + 3其中a仍有原始2。因此b获得5
  • console.log(b * 3)输出15,因为5 * 315

答案 2 :(得分:1)

function doSomething(a) {
    b = a + doSomethingElse(a * 2);
    console.log(b * 3);
}

function doSomethingElse(a) {
    return a - 1;
}

var b;

doSomething(2); //15

当您致电doSomething(2);时,您将value 2传递给您的函数doSomething(a),因此此函数内部的值为a = 2

现在您b = a + doSomethingElse(a * 2) a = 2 b = 2 + doSomethingElse(4)正确了吗?

doSomethingElse(a)功能中,您将value 4 a = 4传递给该功能。它返回a - 1,因此如果a = 4它将返回3

现在回到b = 2 + doSomethingElse(4),因为doSomethingElse(4)返回3,结果为b = 2 + 3

在下一步中,您要打印b * 3 - > console.log(b * 3)会产生15

这是因为a的值在函数范围内是本地的,您可以查看此参考:

Javascript Scope

答案 3 :(得分:1)

我可能错了,但我认为你可能不理解的部分是你打电话时

    doSomethingElse(a * 2)

这部分不像“执行带有'a'参数的doSomethingElse,然后将它与'a * 2'相乘。 这里发生的是你传递'a * 2'作为参数,在你的场景中是4。 doSomethingElse将返回3作为4 - 1的结果。 var b现在是2 + 3的结果。

答案 4 :(得分:0)

很简单,你在doSomething中给2,所以b = 3 + doSomethingElse(4)。然后在doSomethingElse:4-1 = 3,所以它返回3,所以b = 2 + 3

你做(2 + 3)* 3 = 15

sumary:doSomethingElse在显示b * 3之前执行,并且一个值根本没有改变,所以你用a添加doSomethingElse结果,然后将结果乘以3