我试图从jQuery的动画函数中理解我能做什么,但最终遇到了各种我不理解的内部函数,并最终登陆了isWindow.isWindow的代码检查对象是否具有该属性setInterval,否则返回false.
当然,任何对象都可以拥有该属性setInterval而不是窗口,虽然它几乎必须是故意破坏jQuery的功能以拥有具有该确切属性名称的对象,但我可以想象一些合理的情况,它可能是无意的.
有没有更好的方法来检查对象是否是一个窗口对象?难道他们不能使用某些东西
obj.setInterval && obj.setInterval.toString() == 'function setIternval(){ [native code] }
Run Code Online (Sandbox Code Playgroud)
我知道toString内部函数的返回并不是所有浏览器的标准,但是jQuery的编写者似乎非常了解这些跨浏览器的差异.我也知道这也不是一个万无一失的方法,因为有人可以轻易地覆盖该toString方法来返回相同的字符串,但这仍然可以防止将对象误认为窗口的问题.
我不会问我是否认为这isWindow只是由jQuery在内部对象上使用,但它isPlainObject是用于的一部分,.extend可用于外部对象.
关于什么:
function isWindow(obj) {
var toString = Object.prototype.toString.call(obj);
return toString == '[object global]' || toString == '[object Window]' || toString == '[object DOMWindow]';
}
Run Code Online (Sandbox Code Playgroud)
似乎适用于 Chrome、Firefox、Opera、IE 和 Safari(最新版本)