Javascript提升 - 无法理解这一点

时间:2017-05-25 08:40:56

标签: javascript hoisting executioncontext

试图学习Js并且无法理解为什么DOM元素没有得到这个值:

var Car = function(loc) {
  var obj = Object.create(Car.prototype);
  obj.loc = loc;
  obj.move = move;
  return obj;
};

Car.prototype = {
    move : function() {
    this.loc++;
  }
};

var emy = Car(1);
emy.move();

document.getElementById("id").innerHTML = emy.loc;

所以我创建了一个类构造函数及其原型对象,但是最后一行 - document.getElementById("id").innerHTML = emy.loc;没有被执行(除非我把它放在文件的顶部)。那是为什么?

段:

https://jsfiddle.net/awj6mf1b/

2 个答案:

答案 0 :(得分:2)

您尚未定义移动的内容:

var Car = function(loc) {
  var obj = Object.create(Car.prototype);
  obj.loc = loc;
  obj.move = move;  // <<< Here
  return obj;
};

给出错误:

Uncaught ReferenceError: move is not defined
    at Car (VM52:51)
    at window.onload (VM52:61)

您可以通过在实例化过程中将函数放入对象来解决此问题:

var Car = function(loc) {
  var obj = Object.create(Car.prototype);
  obj.loc = loc;
  obj.move = function() {
    this.loc++;
  }
  return obj;
};

或者通过将函数正确添加到原型:

var Car = function(loc) {
  var obj = Object.create(Car.prototype);
  obj.loc = loc;
  // Removed move from here
  return obj;
};

// This adds move to the cars prototype
Car.prototype.move = function() {
  this.loc++;
}

答案 1 :(得分:1)

  

没有被执行(除非我把它放在文件的顶部)

通常表示上述代码中存在错误。代码在执行此行之前崩溃。

检查那个小提琴的控制台日志,你会看到。

哦,吊装与这里发生的事情毫无关系。