Javascript中对象成员的创建和初始化顺序
我对JS对象中成员的初始化和创建顺序有一些疑问。Javascript中对象成员的创建和初始化顺序,javascript,initialization,executioncontext,Javascript,Initialization,Executioncontext,我对JS对象中成员的初始化和创建顺序有一些疑问。 在我的理解中,当调用任何函数时,都会创建函数执行上下文。在这些函数中处理代码也有两个阶段:创建和执行 那么,让我们举一个简单的例子: function Main() { var a = "1"; this.sayHello = function() { console.log("Hello!"); } function inner() { var b = 2; } } new Main(); 所有成
在我的理解中,当调用任何函数时,都会创建函数执行上下文。在这些函数中处理代码也有两个阶段:创建和执行 那么,让我们举一个简单的例子:
function Main() {
var a = "1";
this.sayHello = function() {
console.log("Hello!");
}
function inner() {
var b = 2;
}
}
new Main();
所有成员的创建和初始化顺序是什么?
我知道当我们不使用对象时它是如何工作的:
谢谢!
sayHello
方法是对函数的引用,函数将执行此操作。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不知道这个.sayHello2
。如果在定义这个.sayHello2
方法之前尝试执行这个.sayHello()
,也可以看到同样的情况
Js解释器没有在
sayHello
函数中简单地到达该代码,因此没有错误sayHello
方法是对函数的引用,函数就是这样。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不知道这个.sayHello2
。如果在定义这个.sayHello2
方法之前尝试执行这个.sayHello()
,也可以看到同样的情况
Js解释器没有简单地在
sayHello
函数中到达该代码,因此没有错误我理解它抛出错误的原因。我不确定的是解释器何时设置方法引用。显然,它应该在创建阶段定义之后。而且,它抛出错误的事实意味着实例methods是在执行阶段定义的[因此,它们没有被提升]。这是否意味着当我在对象上调用特定函数时,对象主体中的整个代码都已执行?据我所知,这是sayHello()如何知道sayHello2()的唯一方法existence.assigning永远不会被提升,因此这些赋值会在执行阶段被调用。当你通过new
操作符构造一个对象时,所有构造函数体都会执行,当你执行一个构造对象的方法时,当然,体中的所有内容都已经被赋值和计算过了是的。那么,这个顺序是ri吗ght?1)新的执行上下文2)找到并声明函数3)提升变量4)这是设置5)执行对象的主体,因此所有实例方法都被声明(据我所知,除非调用它们,否则引擎不会读取它们的主体)因此,如果我们调用object的方法,这意味着实例成员已经可用。如果在执行阶段我们尝试调用实例方法(这是一个函数表达式)在实际声明之前,会抛出错误。我理解它抛出错误的原因。我不确定的是解释器何时设置方法引用。显然,它应该在创建阶段定义之后。此外,它抛出错误的事实意味着实例方法是在执行阶段定义的[因此,它们没有被提升]。这是否意味着当我在对象上调用特定函数时,对象主体中的整个代码都已执行?据我所知,这是sayHello()如何知道sayHello2()的唯一方法existence.assigning永远不会被提升,因此这些赋值会在执行阶段被调用。当你通过new
操作符构造一个对象时,所有构造函数体都会执行,当你执行一个构造对象的方法时,当然,体中的所有内容都已经被赋值和计算过了是的。那么,这个顺序是ri吗ght?1)新的执行上下文2)找到并声明函数3)提升变量4)这是设置5)执行对象的主体,因此所有实例方法都被声明(据我所知,除非调用它们,否则引擎不会读取它们的主体)因此,如果我们调用object的方法,这意味着实例成员已经可用。如果在执行阶段,我们尝试在实际声明实例方法(这是函数表达式)之前调用实例方法,则会引发错误