知道为什么这在 Chrome 中不起作用吗?
我得到一个 TypeError: 这不是一个 Date 对象。但是有效
var foo = (new Date).getDate;
foo();(new Date).getDate()
5 回答
该函数在您的示例中未正确绑定。该 foo 调用的“this”对象不是原始日期对象。
使逻辑工作的一种方法是绑定函数:
var x = new Date();
var foo = x.getDate.bind(x);
foo();
问题是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);
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.
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)
在 JavaScript 中,this
上下文并不绑定到对象的每个方法。相反,它是在运行时通过调用该方法的方式确定的。查看此答案以获取有关绑定行为的更多信息。.
在您的代码中,foo
接收 的getDate
属性new Date
,它Date.prototype
通过原型链从 接收。因此,您的代码实际上等同于:
var foo = Date.prototype.getDate;
foo();
(自己测试一下:在您的控制台中验证(new Date).getDate === Date.prototype.getDate
确实是true
.)
现在,应该清楚的是this
,该调用没有实际的上下文。bind
您可以通过手动将函数添加到对象来预先设置它。(注意:旧的浏览器需要一个 shiv。Function.prototype.bind
)
var foo = Date.prototype.getDate.bind(new Date);
foo();
或者,在您/函数时设置适当的this
上下文。call
apply
var foo = Date.prototype.getDate;
foo.call(new Date);