Javascript jQuery';isFunction和InternetExplorer

Javascript jQuery';isFunction和InternetExplorer,javascript,jquery,internet-explorer,Javascript,Jquery,Internet Explorer,在调整jQuery的isFunction方法时 isFunction: function( obj ) { return toString.call(obj) === "[object Function]"; } InternetExlorer 8返回以下错误:“对象不支持此属性或方法”。深入研究此函数无法修复此行为。为了检查是否定义了obj,我更改了参考中的函数: 还有其他解决方案吗?您需要直接从对象调用toString方法。prototype对象: function isFunctio

在调整jQuery的isFunction方法时

isFunction: function( obj ) {
  return toString.call(obj) === "[object Function]";
}
InternetExlorer 8返回以下错误:“对象不支持此属性或方法”。深入研究此函数无法修复此行为。为了检查是否定义了obj,我更改了参考中的函数:


还有其他解决方案吗?

您需要直接从
对象调用
toString
方法。prototype
对象:

function isFunction (obj) {
    return Object.prototype.toString.call(obj) === "[object Function]";
}

alert(isFunction({})); // false
alert(isFunction(function{})); // true
jQuery有一个名为
toString
的局部变量,它引用了
Object.prototype
上的方法

调用just
toString.call(obj)
没有在作用域上声明
toString
标识符,可以在Firefox、Chrome等上工作,这仅仅是因为全局对象继承自
object.prototype
,但规范不保证这一点

Object.prototype.isPrototypeOf(window); // false on IE
您链接到的文章讨论了ECMAScript第5版规范中引入的对
调用
应用
方法的更改

这些方法允许您调用将第一个参数作为调用函数的
this
值传递的函数

在ECMAScript 3上,如果此参数为
undefined
null
,则调用函数的
this
值将引用全局对象,例如:

function test () {  return this; }
test.call(null) === window; // true
alert(Object.prototype.toString.call(document.createElement));
但是在ES5中,这种情况发生了变化,现在应该在不修改的情况下传递该值,这导致
Object.prototype.toString
抛出异常,因为需要一个对象参数

该方法的规范已更改,现在如果
值引用
未定义
null
字符串
“[对象未定义]”
“[对象空]”
将返回,从而解决问题(我认为不太好的事情,因为这两个结果感觉都不对,
undefined
null
不是对象,它们是原语……这让我想起了
typeof null=='object'
…而且我认为它搞乱了
[[Class]]
内部属性的概念……)

现在您可能想知道为什么jQuery使用这个方法来检查函数对象,而不是使用
typeof
操作符

实现错误,例如在Chrome/Safari/WebKit中,RegExp对象的
typeof
返回
“function”
,因为RegExp对象是可调用的,例如:

如果对象实现了使对象可调用的
[[Call]]
内部属性,则
typeof
操作符返回
“function”


这最初是由Mozilla实现引入的,调用RegExp对象相当于调用
exec
方法。

isFunction函数试图服务的目的是什么?它是用来处理主机对象(即浏览器中的DOM节点、
窗口
等)还是正则表达式(CMS在评论中指出,在某些浏览器中,哪些是可调用的,并返回带有
typeof
的“函数”?)如果不是,您只需要

typeof obj == "function"
如果它应该处理宿主方法,那么它是有缺陷的,因为浏览器没有义务为宿主方法返回“[object Function]”。在IE中,有许多可调用的宿主属性不会返回“[object Function]”或会抛出错误。例如:

function test () {  return this; }
test.call(null) === window; // true
alert(Object.prototype.toString.call(document.createElement));

…在IE中给出“[对象]”。

我刚刚在IE 8的控制台中运行了这个:

>>$.isFunction(undefined);
false
很好


您引用的博客文章涉及IE9

Chrome/Safari/Webkit上存在一个与主机对象无关的问题,其中RegExp对象被
类型的
操作符报告为
“function”
,因为它们是可调用的,这不是ECMAScript标准的一部分,它们实现了
[[Call]]
内部…是的。在你提到之前,我已经忘记了这一点。说得好。