我对JS对象中初始化和成员创建的顺序有一些疑问 根据我的理解,当调用任何函数时,会创建一个函数执行上下文。还有两个阶段在这些函数中处理代码:创建和执行。
所以,让我们来看一个简单的例子:
function Main() {
var a = "1";
this.sayHello = function() {
console.log("Hello!");
}
function inner() {
var b = 2;
}
}
new Main();
创建和初始化所有成员的顺序是什么? 我知道当我们不使用对象时它是如何工作的:
这个步骤列表 this.method 的位置是在哪里创建和定义的? 我四处寻找,并认为在执行阶段,如果我在实际定义之前调用 this.method ,则会抛出错误(意味着实例方法尚不存在)。但是,如果我在实例方法内部调用另一个稍后在代码中定义的实例方法,一切正常: function Main(){ var a =“1”;
// this.sayHello() -- error!!
this.sayHello = function() {
this.sayHello2(); // no error (???)
console.log("Hello!");
}
this.sayHello2 = function() {
console.log("Hello2!");
}
function inner() {
var b = 2;
}
}
new Main();
是否有人可以帮助我了解何时创建实例方法以及何时定义它们? JS中的原型对象如何使执行上下文不同(除了更改 this 的引用对象)?
谢谢!
答案 0 :(得分:0)
sayHello
方法是对函数的引用,稍后将在this.sayHello
方法初始化之后执行函数sayHello2
。
如果你做这样的事情:
this.sayHello = (function() {
this.sayHello2(); //error
console.log("Hello!");
}).call(this);
this.sayHello2 = function() {
console.log("Hello2!");
}
function inner() {
var b = 2;
}
}
new Main();
使用iife,因此函数会立即调用,而不会抛出错误,因为js不知道this.sayHello2
。如果您在定义this.sayHello()
方法之前尝试执行this.sayHello2
,则可以看到同样的事情。
Js解释器并没有简单地在sayHello
函数中找到该代码,因此没有错误