呵呵 有的人看到这个题目可能觉得,咦,这不就是判断对象是否是function吗?
我记得以前吧有一个同学义正言辞地说我研究过YUI,不相信我给你贴代码。
var L = Y.Lang || (Y.Lang = {});
var TYPES = {
'undefined' : 'undefined',
'number' : 'number',
'boolean' : 'boolean',
'string' : 'string',
'[object Function]': 'function',
'[object RegExp]' : 'regexp',
'[object Array]' : 'array',
'[object Date]' : 'date',
'[object Error]' : 'error'
},
TOSTRING = Object.prototype.toString;
/**
* <p>
* Determines whether or not the provided item is a function.
* Note: Internet Explorer thinks certain functions are objects:
* </p>
*
* <pre>
* var obj = document.createElement("object");
* Y.Lang.isFunction(obj.getAttribute) // reports false in IE
*
* var input = document.createElement("input"); // append to body
* Y.Lang.isFunction(input.focus) // reports false in IE
* </pre>
*
* <p>
* You will have to implement additional tests if these functions
* matter to you.
* </p>
*
* @method isFunction
* @static
* @param o The object to test.
* @return {boolean} true if o is a function.
*/
L.isFunction = function(o) {
return L.type(o) === 'function';
};
L.type = function(o) {
return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
};
呵呵 结果自己就傻了,请仔细看看,人家不是typeof 是自己封装的api------L.type
只所以想说一个这样的话题是因为,很多的流行的插件包括一些老一点的脚本库在isFunction的判断上多有这样的写法
/*
判断参数是否是function
*/
isFunction: function(source){
return typeof(source) === "function";
}
我们先做个测试吧。
var obj = document.createElement("object");
console.log(typeof(obj.getAttribute) === "function");
console.log((typeof(obj.getAttribute)) ==== "function");
请再IE浏览器下测试
你会发现false了? 呵呵
我们再回过头看看上面YUI的代码,看什么-----------------------注释
<p>
* Determines whether or not the provided item is a function.
* Note: Internet Explorer thinks certain functions are objects:
* </p>
翻译一下吧:IE会认为某些functions是object (言辞很严谨啊)
ps题外话-------最近看到有一个大三学生实习面试的时候说自己有3年工作经验(注意说的是工作经验,还义正言辞),一天打2W行代码。(好吧本人表示膜拜,佩服,建议没毕业的和毕业的多向这个同学学习)
。。。。。。。。。。。。。。。。。。。
简单地总结一下:
我们无论在设计api还是一般的代码编写的时候,最好注意一下这些细节的问题,有的时候报错了,需要一段一段地去注释去排除,结果发现原来自己的工具类api错误了。
只是一些细节和代码严谨度的思考。供参考
下面链接是我贴出的自己整理的lang的lib的一个isFunction的写法(和JQuery还有tangram是一致的)
http://zhangyaochun.iteye.com/blog/1205543
当然说明一下,这个api在IE下浏览器下判断isFunction的时候也有缺陷的
看看Jquery的源码注释
They return false on IE (#2968).
//测试代码
var obj = document.createElement("object");
Object.prototype.toString.call(obj.getAttribute);
分享到:
相关推荐
function(){ fn&&fn() } 大概意思是这么个意思,但是这我感觉这样写好像没意义,有带佬能指点一下吗 fn 不存在就什么都不做,不会报错,fn 存在才尝试执行 fn 一般来说fn && fn()就如同下面的语句 if (fn) { fn...
/** * 获取函数的形参个数 ... if (typeof func == 'function') { var mathes = /[^(]+\(([^)]*)?\)/gm.exec(Function.prototype.toString.call(func)); if (mathes[1]) { var args = mathes[1].rep
if (typeof define === "function" && (define.amd)) { define( "jquery", [], function() { return jQuery; }); } 改成 if (typeof define === "function" && (define.amd || define.cmd)) { defi
杂工是的叉子安装npm install handymanbower install handyman用法承诺: var square = handyman ( function ( number ) { var deferred = this . defer ( ) ; if ( typeof number === 'number' || number ...
代码如下:function getEvent(){ //同时兼容ie和ff的写法 if(document.all) return window.event; func=getEvent.caller; while(func!=null){ var arg0=func.arguments[0]; if(arg0){ if((arg0.constructor==Event ||...
在继续讲述之前,先看一下函数的使用语法: 以下是引用片段: function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function(); 这些都是声明函数的正确语法。...
(function () { var logger = { log: function (){}, warn: function (){}, error: function (){} }; // normalize environment var RTCPeerConnection = null, getUserMedia = null, attachMediaStream = ...
1.window.event兼容脚本 function getEvent(){ //获取浏览器事件,同时兼容ie和ff的写法 if(document.all) return window.event; func=getEvent.caller; while(func!=null){ var arg0=func.arguments[0];...
babel-plugin-transform-海象运算符将海象运算符:=编译为IIFE关于作业说明将42分配给x... 通常变成if ( ( function ( x ) { if ( typeof x === 'undefined' ) throw new Error ( ) ; x = 2 ; return x ;} ) ( x ) ) ale
function getEvent() { if (document.all) { return window.event; //for ie } func = getEvent.caller; while (func != null) { var arg0 = func.arguments[0]; if (arg0) { if ((arg0.constructor == ...
(function(){ var a = b = 3; })(); console.log("a defined? " + (typeof a !== 'undefined')); console.log("b defined? " + (typeof b !== 'undefined')); var myObject = { foo: "bar", func: function() { var ...
但是作者Nicholas C. Zakas在【动态原型】方式创建对象的时候没有深究可能会存在的问题和解决... if (typeof A._init == ‘undefined’) { A.prototype.func = function () { return 0; } A._init = 1; } } function su
a(_[B],$[B],true))return false}return true}else if(typeof _=="function"&&typeof $=="function")return _.toString()==$.toString();else return _==$}function J(){var _,A,$=Y[N][C]("script");for(var B=0;B...
我们来看一个例子,来说明这个 代码如下: function a(c){ this.b = c; this.d =function(){ alert(this.b); } } var obj = new a(‘test’); alert(typeof obj.prototype);//undefine alert(...
if (typeof(res) == "object" || typeof(res) == "function" || res !== null) { return res; } return target; } 四大步骤: 创建一个空对象,并且 this 变量引用该对象,// let target = {}; 继承了函数的...
function func1(…){…}var func2=function(…){…};var func3=function func4(…){…};var func5=new Function(); 这些都是声明函数的正确语法。它们和其他语言中常见的函数或之前介绍的函数定义
在继续讲述之前,先看一下函数的使用语法: function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function(); 这些都是声明函数的正确语法。它们和其他语言...
昨天弄了个表格隔行换色,但是只是一张表里换 如果一个页面里出现多个表格需要怎么整 捣鼓出新的结果 如下: 代码如下: function onloadEvent(func){ var one=[removed] if(typeof [removed]!=’function’){ ...
代码如下: [removed] function tt1(){ alert(... } function addLoadEvent(func) { var oldonload = [removed]; if (typeof [removed] != ‘function’) { [removed] = func; } else { [removed] = function() {
函数是JavaScript中很重要的一个语言元素,并且提供了一个function关键字和内置对象Function,下面是其可能的用法和它们之间的...typeof(foo01)); alert(foo01()); 运行结果: function 300 最普通的fu