为什么打印窗口对象而不是打印日期对象?

时间:2015-10-23 19:17:41

标签: javascript

我遇到了这段代码。我希望this是日期而不是窗口对象。我在Firefox暂存器中运行它。我错过了什么?

This image describes the result



Date.prototype.nextDay = function() {
  console.log('Printing this ' + this);
  var currentdate = this.getDate();
  return new Date(this.setDate(currentdate + 1));
}
(function() {
  var date = new Date();
  document.write(date);
  document.write(date.nextDay());
})();




1 个答案:

答案 0 :(得分:2)

你违反了JavaScript的阴险自动分号插入(或者在这种情况下,没有插入)。

你认为是两个单独的陈述:

Date.prototype.nextDay = function () { ... }

(function () { ... })();

被解释为一个单一的陈述:

Date.prototype.nextDay = function () { ... }(function () { ... })();

您的第一个匿名函数将立即被第二个匿名函数作为其参数调用。

由于它没有被调用为任何对象的方法,并且由于您没有以严格模式运行,this正在评估全局对象。这解释了你所看到的行为。

在行的开头有一个左括号是JavaScript解析器无法做到的几个地方之一"猜测"你想结束以前的声明。 People who avoid semicolons as much as possible通常会在任何带有分号的语句起始括号之前指出:

Date.prototype.nextDay = function () {
    console.log('Printing this ' + this)
    var currentdate = this.getDate()
    return new Date(this.setDate(currentdate + 1))
}
;(function () {
    var date = new Date()
    console.log(date)
    console.log(date.nextDay())
})()