知道为什么这在Chrome中不起作用?
var foo = (new Date).getDate;
foo();
我得到一个TypeError:这不是Date对象。但是(new Date).getDate()
有效
答案 0 :(得分:4)
在您的示例中,该函数未正确绑定。该foo调用的“this”对象不是原始日期对象。
使逻辑工作的一种方法是绑定函数:
var x = new Date();
var foo = x.getDate.bind(x);
foo();
答案 1 :(得分: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);
答案 2 :(得分:0)
你想要做的是
var date = new Date;
var foo = date.getDate.bind(Date)
foo()
或
var date = new Date;
var foo = date.getDate;
foo.call(date);
当您像调用foo
时一样,它将没有对日期对象的引用,这就是它抛出错误的原因。
答案 3 :(得分:0)
因为代码中的foo
只是一个不与任何对象绑定的函数。它需要来自Date
对象的一些其他信息才能被调用。你可以这样做:
var date = new Date()
var foo = date.getDate
foo.call(date)
答案 4 :(得分:0)
在JavaScript中,this
上下文不绑定到对象的每个方法。相反,它是在运行时通过调用方法Check this answer for more about the binding behaviour.确定的。
在您的代码中,foo
会收到getDate
new Date
的{{1}}属性,它通过原型链从Date.prototype
收到。因此,您的代码实际上等同于:
var foo = Date.prototype.getDate;
foo();
(自行测试:在您的控制台中验证(new Date).getDate === Date.prototype.getDate
确实是true
。)
现在,应该清楚该调用没有实际的this
上下文。您可以通过手动bind
将函数设置为对象来预先设置它。 (注意:Function.prototype.bind
的{{3}}。)
var foo = Date.prototype.getDate.bind(new Date);
foo();
或者,在this
/ call
函数时设置正确的apply
上下文。
var foo = Date.prototype.getDate;
foo.call(new Date);