jQuery的isFunction和InternetExplorer

pex*_*pex 2 javascript jquery internet-explorer

在适应jQuery的isFunction方法时

isFunction: function( obj ) {
  return toString.call(obj) === "[object Function]";
}
Run Code Online (Sandbox Code Playgroud)

InternetExlorer 8返回以下错误:"对象不支持此属性或方法".深入研究这个函数的好文章不会解决这个问题.为了检查是否定义了obj,我在参考MSDN文章时更改了该函数:

isFunction: function( obj ) {
  return obj && toString.call(obj) === "[object Function]";
}
Run Code Online (Sandbox Code Playgroud)

解决方案还有其他任何想法吗?

CMS*_*CMS 9

您需要toString直接从Object.prototype对象调用该方法:

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

alert(isFunction({})); // false
alert(isFunction(function{})); // true
Run Code Online (Sandbox Code Playgroud)

jQuery有一个名为的局部变量toString,它引用了方法Object.prototype.

只是在toString.call(obj);没有声明toString范围上的标识符的情况下调用,可以在Firefox,Chrome等上运行,因为Global对象继承Object.prototype,但这不是规范所保证的.

Object.prototype.isPrototypeOf(window); // false on IE
Run Code Online (Sandbox Code Playgroud)

您链接的文章讨论了ECMAScript第5版规范中引入的更改callapply方法.

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

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

function test () {  return this; }
test.call(null) === window; // true
Run Code Online (Sandbox Code Playgroud)

但是在ES5中发生了变化,现在应该在没有修改的情况下传递该值,并且导致Object.prototype.toString抛出异常,因为期望对象参数.

该方法的规格改变,现在如果this值是指undefinednull字符串"[object Undefined]""[object Null]"将被退回,解决了这个问题(我不认为这是真正的好东西,因为这两种结果的结果感到绝对错误的,undefined并且null没有对象,他们是原始的......这让我记得typeof null == 'object'......而且我认为它与[[Class]]内部财产的概念混淆了,无论如何......)

现在您可能想知道为什么jQuery使用此方法来检查函数对象,而不是使用typeof运算符?

实现错误,例如在Chrome/Safari/WebKit中,typeoffor RegExp对象返回"function",因为RegExp对象可以调用,例如:

typeof /foo/; // "function" in Chrome/Safari/WebKit
Run Code Online (Sandbox Code Playgroud)

typeof运算符返回"function",如果对象实现了[[Call]]内部属性,这使得对象是可调用.

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