4

知道为什么这在 Chrome 中不起作用吗? 我得到一个 TypeError: 这不是一个 Date 对象。但是有效
var foo = (new Date).getDate;
foo();

(new Date).getDate()

4

5 回答 5

4

该函数在您的示例中未正确绑定。该 foo 调用的“this”对象不是原始日期对象。

使逻辑工作的一种方法是绑定函数:

var x = new Date();
var foo = x.getDate.bind(x);
foo();
于 2013-07-27T15:50:48.217 回答
1

问题是this,当您调用该函数时,它不是日期,而是全局上下文 ( window)。

你可以这样做:

foo.call(new Date());

或者,如果您希望能够在任何地方使用该功能并且仍然使用原始日期,您可以使用

var date = new Date();
var foo = function() { return date.getDate() }; // returns always the same date

或者

var foo = function() { return (new Date()).getDate() }; // returns the current date

如果没有 IE8,你也可以使用bind

var foo = date.bind(date);
于 2013-07-27T15:50:48.643 回答
0

What you want to do is either

var date = new Date;
var foo = date.getDate.bind(Date)
foo()

or

var date = new Date;
var foo = date.getDate;
foo.call(date);

When you call foo as you did, it won't have a reference to a date object, which is why it throws an error.

于 2013-07-27T15:53:14.447 回答
0

Because foo in your code is just a function which is not bind with any object. It requires some other info from Date object in order to be called. You can do this:

var date = new Date()
var foo = date.getDate
foo.call(date)
于 2013-07-27T15:54:19.043 回答
0

在 JavaScript 中,this上下文并不绑定到对象的每个方法。相反,它是在运行时通过调用该方法的方式确定的。查看此答案以获取有关绑定行为的更多信息。.

在您的代码中,foo接收 的getDate属性new Date,它Date.prototype通过原型链从 接收。因此,您的代码实际上等同于:

var foo = Date.prototype.getDate;
foo();

(自己测试一下:在您的控制台中验证(new Date).getDate === Date.prototype.getDate确实是true.)

现在,应该清楚的是this,该调用没有实际的上下文。bind您可以通过手动将函数添加到对象来预先设置它。(注意:旧的浏览器需要一个 shivFunction.prototype.bind

var foo = Date.prototype.getDate.bind(new Date);
foo();

或者,在您/函数时设置适当的this上下文。callapply

var foo = Date.prototype.getDate;
foo.call(new Date);
于 2013-07-27T15:58:22.947 回答