从上到下读取javascript代码吗?
换句话说,如果我有:
function Color(){
}
function Weather() {
}
如果我想在Color功能中加入某种类型的天气对象,那么之后可以定义Weather吗?
答案 0 :(得分:3)
函数Color
在解析时不知道Weather
,但是一旦被调用它就会知道。例如:
// Since variable declarations are hoisted to the top,
// myVar will be undefined (same as simply saying "var myVar;")
console.log(myVar); // <-- undefined
var myVar = 5;
console.log(myVar); // <-- 5
// test2 hasn't been defined yet, but it doesn't matter
// because test isn't being executed
var test = function() {
test2();
}
// This will throw an error: undefined is not a function
// because test2 isn't defined
test();
var test2 = function() {
alert("test2");
}
// This won't throw an error
test();
基本上,您应该在定义所有功能后执行。但是,如果您使用function functName() {}
语法,则会像var
语句一样将其挂起。
function test() {
test2();
}
// Works!
test();
function test2() { alert("test2"); }
答案 1 :(得分:1)
JavaScript 解析&#34;自上而下&#34;和函数声明是提升结构 - 请参阅var functionName = function() {} vs function functionName() {}。解析在 JavaScript执行本身启动之前发生;因此,以下内容涵盖评估语义 1 。
鉴于函数提升的效果,以下代码是有效的,虽然它似乎可能不是:
function a(){
return b();
}
alert(a()); // alerts "b", even though "b comes later"
// This declaration IS hoisted
function b() {
return "b";
}
然而,考虑到即使使用&#34; var fn = ..&#34; (当分配不悬挂时),排序通常并不重要,因为分配的评估在使用之前发生
var a = function () {
return b();
}
// alert(a()); <- this would fail, because b is not assigned yet
// This assignment is NOT hoisted
var b = function () {
return "b";
}
// But b is assigned before here, meaning that the order of the constructor
// functions still Just Doesn't Matter.
alert(a());
因此,在存在两个相互依赖的构造函数(例如颜色和天气)的情况下, 它们位于同一范围内并不重要相对于彼此。
1 重要的是表示依赖关系的表达式在评估时是可解析的(相对于评估代码,但不是与函数的解析/放置顺序有关。)
答案 2 :(得分:0)
所以基本上是的,你可以对以前的代码中出现的函数实现一些东西。 这有助于您更好地理解它。
var weather = function() {
if (weather === red) {
console.log("weather is represented by the color red");
}
else {
console.log("Not the right color");
}
};
weather(red);