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)
解决方案还有其他任何想法吗?
您需要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版规范中引入的更改call和apply方法.
这些方法允许您调用将第一个参数作为this调用函数的值传递的函数.
在ECMAScript 3上,如果此参数为undefined或null,this则调用函数的值将引用全局对象,例如:
function test () { return this; }
test.call(null) === window; // true
Run Code Online (Sandbox Code Playgroud)
但是在ES5中发生了变化,现在应该在没有修改的情况下传递该值,并且导致Object.prototype.toString抛出异常,因为期望对象参数.
该方法的规格改变,现在如果this值是指undefined或null字符串"[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方法.
| 归档时间: |
|
| 查看次数: |
2051 次 |
| 最近记录: |