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

时间:2015-11-13 23:57:11

标签: javascript initialization executioncontext

我对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 的引用对象)?

    谢谢!

  • 1 个答案:

    答案 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函数中找到该代码,因此没有错误