我遇到了这段代码。我希望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());
})();

答案 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())
})()