Javascript中对象成员的创建和初始化顺序

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(); 所有成

我对JS对象中成员的初始化和创建顺序有一些疑问。
在我的理解中,当调用任何函数时,都会创建函数执行上下文。在这些函数中处理代码也有两个阶段:创建和执行

那么,让我们举一个简单的例子:

function Main() {
  var a = "1";

  this.sayHello = function() {
     console.log("Hello!");
  }

  function inner() {
     var b = 2;
  }
}

new Main();
所有成员的创建和初始化顺序是什么? 我知道当我们不使用对象时它是如何工作的:
  • 创建新的执行上下文并将其添加到堆栈中
  • 扫描代码中的函数[除非被调用,否则不会对代码进行求值--它只是知道那里有一个特定的函数]
  • 所有变量均已提升
  • 正在分配此变量
  • 执行阶段开始:代码逐行执行(包括所有变量赋值等;如果调用了任何函数,则创建另一个执行上下文,流程重新开始)

    在此步骤列表中的何处创建和定义此.method? 我四处摸索,发现在执行阶段,如果我在实际定义一个this.method之前调用它,就会抛出一个错误(意味着实例方法还不存在)。然而,若我在instance方法内部调用代码后面定义的另一个instance方法,则一切正常: 函数Main(){ var a=“1”

    有谁能帮助我理解实例方法是什么时候创建的,什么时候定义的?JS中的原型对象如何使执行上下文不同(除了更改this的引用对象之外)


    谢谢!

    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的方法,这意味着实例成员已经可用。如果在执行阶段,我们尝试在实际声明实例方法(这是函数表达式)之前调用实例方法,则会引发错误