Javascript 需要帮助来了解这种情况吗

Javascript 需要帮助来了解这种情况吗,javascript,function,Javascript,Function,我不明白为什么结果是15;有人能告诉我在这种情况下应该怎么想吗?doSomethingElse()是用参数4(a*2)调用的。它返回3。(3+2)*3=15 函数doSomething(a){ b=a+doSomethingElse(a*2); console.log('a',a,doSomethingElse(a*2)的参数); 控制台日志(b*3); } 函数doSomethingElse(a){ console.log('params b',a); 返回a-1; } var b; 剂量测

我不明白为什么结果是15;有人能告诉我在这种情况下应该怎么想吗?

doSomethingElse()是用参数4(a*2)调用的。它返回3。(3+2)*3=15

函数doSomething(a){
b=a+doSomethingElse(a*2);
console.log('a',a,doSomethingElse(a*2)的参数);
控制台日志(b*3);
}
函数doSomethingElse(a){
console.log('params b',a);
返回a-1;
}
var b;

剂量测定法(2)//15
简单一点,你给2个剂量,所以b=3+4。然后在doSomethingElse中:4-1=3,所以它返回3,所以b=2+3

而你做到了(2+3)*3=15

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

有人能告诉我在这种情况下我该怎么想吗

最好的方法是使用IDE中内置的调试器和/或浏览器中内置的调试器。将代码放在一个页面中,在末尾的
doSomething(2)
调用上放置一个断点,然后单步执行代码,同时观察
a
b
的值。使用调试器是一项基本技能,可以很早地学习,而不是高级技能

这里发生的是:

  • b
    是全局声明的(最初具有值
    undefined
    ),因为
    var
    声明是在范围内的任何其他声明之前处理的(有时称为“提升”)
  • doSomething(2)
    被调用
  • 它调用
    doSomethingElse(a*2)
    其中
    a
    2
  • doSomethingElse
    返回
    3
    ,因为
    a-1
    4-1
    3
  • 调用
    doSomethingElse
    时使用
    3
    ,因此包含该调用的行实际上是
    b=a+3
    ,其中
    a
    仍然具有原始
    2
    。所以
    b
    得到
    5
  • console.log(b*3)
    输出
    15
    ,因为
    5*3
    15
当你调用
doSomething(2)
值2
传递给函数
doSomething(a)
因此此函数中a的值为
a=2

现在你有了
b=a+doSomethingElse(a*2)
a=2
这是
b=2+doSomethingElse(4)
正确吗

doSomethingElse(a)
函数中,您将
值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
的值是函数范围内的本地值,您可以检查该值以供参考:


我可能错了,但我想你可能不明白的是你打电话的时候

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

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

var b;

doSomething(2); //15
这部分不像“使用'a'参数执行doSomethingElse,然后将其与'a*2'相乘”。 这里发生的是将'a*2'作为参数传递,在您的场景中是4。 doSomethingElse将返回3,结果是4-1。
var b现在是5,是2+3的结果。

当调用
doSomething(2)
时,您认为
a
doSomethingElse
中的值是多少?为什么?当
doSomethingElse(a*2)时,另一个名为
a
的变量如何
被调用?
为什么结果是15
你认为它应该是什么?我的意思是,它是15,因为数学,顺便说一句,从技术上讲,调用doSomething的结果是
未定义的
我仍然有兴趣知道预期的结果只是一个小的更正:
doSomethingElse
被调用为
4
作为参数,而不是参数。参数只是
a
(顺便说一下,与
doSomething
相同)。
function doSomething(a) {
    b = a + doSomethingElse(a * 2);
    console.log(b * 3);
}

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

var b;

doSomething(2); //15
    doSomethingElse(a * 2)