`
zhangyaochun
  • 浏览: 2569041 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

typeof func ==='function'的疑惑

阅读更多

 

呵呵 有的人看到这个题目可能觉得,咦,这不就是判断对象是否是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
 * &nbsp;
 * 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);
1
0
分享到:
评论
1 楼 sscsacdsadcsd 2015-07-04  
我的天 那到底是为什么function是object
我看underscore也这样
  _.isObject = function(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  };

相关推荐

    JS typeof fn === function && fn()详解

    function(){ fn&&fn() } 大概意思是这么个意思,但是这我感觉这样写好像没意义,有带佬能指点一下吗 fn 不存在就什么都不做,不会报错,fn 存在才尝试执行 fn 一般来说fn && fn()就如同下面的语句 if (fn) { fn...

    javascript 获取函数形参个数

    /** * 获取函数的形参个数 ... if (typeof func == 'function') { var mathes = /[^(]+\(([^)]*)?\)/gm.exec&#40;Function.prototype.toString.call(func&#41;); if (mathes[1]) { var args = mathes[1].rep

    seajs加载jquery时提示$ is not a function该怎么解决

    if (typeof define === "function" && (define.amd)) { define( "jquery", [], function() { return jQuery; }); } 改成 if (typeof define === "function" && (define.amd || define.cmd)) { defi

    handyman:带有 Promise 的 Web Workers

    杂工是的叉子安装npm install handymanbower install handyman用法承诺: var square = handyman ( function ( number ) { var deferred = this . defer ( ) ; if ( typeof number === 'number' || number ...

    event对象的方法 兼容多浏览器

    代码如下: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 ||...

    javascript function、指针及内置对象

    在继续讲述之前,先看一下函数的使用语法: 以下是引用片段: function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function(); 这些都是声明函数的正确语法。...

    simplewebrtc.js webrtc网页视频开发帮助工具

    (function () { var logger = { log: function (){}, warn: function (){}, error: function (){} }; // normalize environment var RTCPeerConnection = null, getUserMedia = null, attachMediaStream = ...

    Firefox和IE浏览器兼容JS脚本写法小结

    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-walrus-operator:从js中的赋值表达式返回值

    babel-plugin-transform-海象运算符将海象运算符:=编译为IIFE关于作业说明将42分配给x... 通常变成if ( ( function ( x ) { if ( typeof x === 'undefined' ) throw new Error ( ) ; x = 2 ; return x ;} ) ( x ) ) ale

    基于js实现的限制文本框只可以输入数字

    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 == ...

    java餐饮小程序源码-interview-questions:该存储库包括前端开发人员的面试问题

    (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 ...

    JavaScript高级程序设计 扩展–关于动态原型

    但是作者Nicholas C. Zakas在【动态原型】方式创建对象的时候没有深究可能会存在的问题和解决... if (typeof A._init == ‘undefined’) { A.prototype.func = function () { return 0; } A._init = 1; } } function su

    my97日历控件

    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...

    深入分析js中的constructor和prototype

    我们来看一个例子,来说明这个 代码如下: function a(c){ this.b = c; this.d =function(){ alert&#40;this.b&#41;; } } var obj = new a(‘test’); alert&#40;typeof obj.prototype&#41;;//undefine alert&#40;...

    weekly:每周发行并分享

    if (typeof(res) == "object" || typeof(res) == "function" || res !== null) { return res; } return target; } 四大步骤: 创建一个空对象,并且 this 变量引用该对象,// let target = {}; 继承了函数的...

    AJAX入门之深入理解JavaScript中的函数

    function func1(…){…}var func2=function(…){…};var func3=function func4(…){…};var func5=new Function(); 这些都是声明函数的正确语法。它们和其他语言中常见的函数或之前介绍的函数定义

    深入认识JavaScript中的函数

    在继续讲述之前,先看一下函数的使用语法: function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function(); 这些都是声明函数的正确语法。它们和其他语言...

    表格 隔行换色升级版

    昨天弄了个表格隔行换色,但是只是一张表里换 如果一个页面里出现多个表格需要怎么整 捣鼓出新的结果 如下: 代码如下: function onloadEvent(func){ var one=[removed] if(typeof [removed]!=’function’){ ...

    [removed]追加函数使用示例

    代码如下: [removed] function tt1(){ alert&#40;... } function addLoadEvent(func) { var oldonload = [removed]; if (typeof [removed] != ‘function’) { [removed] = func; } else { [removed] = function() {

    function, new function, new Function之间的区别

    函数是JavaScript中很重要的一个语言元素,并且提供了一个function关键字和内置对象Function,下面是其可能的用法和它们之间的...typeof(foo01&#41;); alert&#40;foo01(&#41;); 运行结果: function 300 最普通的fu

Global site tag (gtag.js) - Google Analytics