function doSomething(a) {
b = a + doSomethingElse(a * 2);
console.log(b * 3);
}
function doSomethingElse(a) {
return a - 1;
}
var b;
doSomething(2); //15
我不明白为什么结果是15;有人可以向我解释在这种情况下我该怎么想?
答案 0 :(得分:6)
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)
调用上放置断点,然后逐步执行代码,随时查看a
和b
的值。使用调试器是早期学习的基本技能,而不是高级技能。
这里发生的事情是:
b
是全局声明的(并且最初具有值undefined
),因为var
声明在范围内的任何其他声明之前处理(有时称为“提升”)。 / LI>
doSomething(2)
被召唤。doSomethingElse(a * 2)
,其中a
为2
。doSomethingElse
返回3
,因为a - 1
4 - 1
为3
。3
的地方使用doSomethingElse
,因此包含该调用的行有效b = a + 3
其中a
仍有原始2
。因此b
获得5
。console.log(b * 3)
输出15
,因为5 * 3
为15
。答案 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
的值在函数范围内是本地的,您可以查看此参考:
答案 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