JavaScript调用函数

时间:2015-09-17 08:24:47

标签: javascript function callstack

有人能解释一下它是如何运作的吗?

console.log(func(10));
// 20
var func = function(x) {
    return x * x;
}

console.log(func(10));
// 100
var func = function(x) {
    return x + x;
}

我想知道电脑怎么读?请尽可能简单地解释。

修改
我问,因为我在书中找到了#34; Eloquent Javascript"像这样的东西:

console.log("The future says:", future());

function future() {
  return "We STILL have no flying cars.";
}

他说:

  

此代码有效,即使该函数在代码下面定义   使用它。这是因为函数声明不属于   常规的从上到下的控制流程。它们在概念上被移动了   在其范围的顶部,可以被其中的所有代码使用   范围。这有时很有用,因为它给了我们自由   以一种看似有意义的方式订购代码,而不必担心   必须在第一次使用之前定义所有功能。

1 个答案:

答案 0 :(得分:2)

更新:重新编辑,请参阅下面的分隔符。

你给它的代码不会工作。我们可以重新排序它以使其工作,但是:

λ> runTeletypeReader '\n' (putStrLn' "Hello" >> putStrLn' "World")
Hello
World

λ> runTeletypeReader ':' (putStrLn' "Hello" >> putStrLn' "World")
Hello:World:

以下是上述情况:

  1. 逐步执行代码之前,浏览器会扫描var func = function(x) { return x * x; }; console.log(func(10)); // 100 var func = function(x) { return x + x; }; console.log(func(10)); // 20 声明的代码。它找到第一个var,因此它在当前上下文中使用该名称创建一个变量。然后它找到第二个var func,但由于名称相同,它对第二个没有任何作用。此时,var的值为func。 (事先undefined提到的这个位称为“var hoisting。”)

    现在,代码的逐步执行开始了。

  2. 引擎为var变量指定了一个函数。

  3. 引擎调用func,传入func10返回func10 * 10);引擎将该值传递给100,并将其写出来。

  4. 引擎为console.log变量分配了新功能。

  5. 引擎调用func,传入func10返回func10 + 10);引擎将该值传递给200,并将其写出来。

  6. 那么你所展示的代码有什么问题?以下是引擎如何在问题中运行代码:

    1. 逐步执行代码之前,浏览器会扫描console.log声明的代码并创建上面#1中的变量。

      现在,代码的逐步执行开始了。

    2. 引擎尝试调用var,但func中的值当前为func,因此失败并显示错误。

    3. 重新编辑:您从Eloquent JavaScript发布的代码非常不同:

      undefined

      使用函数声明,而您之前的代码使用函数表达式This question and its answers详细介绍,但声明和表达式,即使它们看起来非常相似,但彼此之间的行为却截然不同。以下是上述事项的顺序:

      1. JavaScript引擎扫描代码,查找函数声明并按源代码顺序处理它们。因此它会看到console.log("The future says:", future()); function future() { return "We STILL have no flying cars."; } 并创建函数,并将其与范围内标识符function future() { ... }相关联。这被称为“函数声明提升”,它有点像future上面提升,因为它发生在任何分步代码完成之前。

        然后逐步执行。

      2. 引擎调用var函数,获取其返回值,然后使用该返回值调用future