有人能解释一下它是如何运作的吗?
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.";
}
他说:
此代码有效,即使该函数在代码下面定义 使用它。这是因为函数声明不属于 常规的从上到下的控制流程。它们在概念上被移动了 在其范围的顶部,可以被其中的所有代码使用 范围。这有时很有用,因为它给了我们自由 以一种看似有意义的方式订购代码,而不必担心 必须在第一次使用之前定义所有功能。
答案 0 :(得分:2)
更新:重新编辑,请参阅下面的分隔符。
你给它的代码不会工作。我们可以重新排序它以使其工作,但是:
λ> runTeletypeReader '\n' (putStrLn' "Hello" >> putStrLn' "World")
Hello
World
λ> runTeletypeReader ':' (putStrLn' "Hello" >> putStrLn' "World")
Hello:World:
以下是上述情况:
在逐步执行代码之前,浏览器会扫描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。”)
现在,代码的逐步执行开始了。
引擎为var
变量指定了一个函数。
引擎调用func
,传入func
。 10
返回func
(10 * 10
);引擎将该值传递给100
,并将其写出来。
引擎为console.log
变量分配了新功能。
引擎调用func
,传入func
。 10
返回func
(10 + 10
);引擎将该值传递给200
,并将其写出来。
那么你所展示的代码有什么问题?以下是引擎如何在问题中运行代码:
在逐步执行代码之前,浏览器会扫描console.log
声明的代码并创建上面#1中的变量。
现在,代码的逐步执行开始了。
引擎尝试调用var
,但func
中的值当前为func
,因此失败并显示错误。
重新编辑:您从Eloquent JavaScript发布的代码非常不同:
undefined
使用函数声明,而您之前的代码使用函数表达式。 This question and its answers详细介绍,但声明和表达式,即使它们看起来非常相似,但彼此之间的行为却截然不同。以下是上述事项的顺序:
JavaScript引擎扫描代码,查找函数声明并按源代码顺序处理它们。因此它会看到console.log("The future says:", future());
function future() {
return "We STILL have no flying cars.";
}
并创建函数,并将其与范围内标识符function future() { ... }
相关联。这被称为“函数声明提升”,它有点像future
上面提升,因为它发生在任何分步代码完成之前。
然后逐步执行。
引擎调用var
函数,获取其返回值,然后使用该返回值调用future
。