呵呵 有的人看到这个题目可能觉得,咦,这不就是判断对象是否是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);
分享到:
相关推荐
`typeof fn === 'function' && fn()` 这种模式就是一种常见的方式来确保安全地调用函数。这个模式的核心在于利用了JavaScript中的逻辑与(`&&`)操作符的短路特性。 首先,`typeof fn` 返回一个字符串,表示变量 `...
/** * 获取函数的形参个数 ... if (typeof func == 'function') { var mathes = /[^(]+\(([^)]*)?\)/gm.exec(Function.prototype.toString.call(func)); if (mathes[1]) { var args = mathes[1].rep
var func3 = function func4(...args) { // 函数体 }; ``` 3. **Function构造函数**:允许动态创建函数,但不推荐使用。 ```javascript var func5 = new Function(); ``` #### 三、函数调用的不同模式 ###...
func: function() { var self = this; console.log("outer func: this.foo=" + this.foo); // 输出 "outer func: this.foo=bar" console.log("outer func: self.foo=" + self.foo); // 输出 "outer func: self....
- `typeof func === 'function'`检查一个值是否为函数。 9. 空对象、空数组和空字符串验证: - `Object.keys(obj).length === 0`检查对象是否有属性。 - `arr.length === 0`检查数组是否为空。 - `str.trim() =...
console.log(func instanceof Function); // true ``` #### 2.3 `this`的固定 箭头函数的`this`值继承自外层作用域,不会像普通函数那样根据调用方式改变: ```javascript var obj = { data: ['John Backus', '...
- 判断函数:`typeof func === "function"`可以用来检查一个变量是否为函数。 - 判断undefined:直接使用`typeof var === "undefined"`,这可以避免未声明变量导致的错误。 总之,JavaScript中的类型判断需要根据...
var func = new Function('a', 'b', 'console.log(a + b);'); func(1, 2); // 3 ``` 总结来说,JavaScript中的函数不仅是一种执行任务的手段,还是一种高级的数据类型,支持诸如闭包、高阶函数等复杂的编程模式...
var func = new Function('a', 'b', 'console.log(a + b);'); func(1, 2); // 输出3 ``` 在特殊的`Function`构造器创建的函数中,`arguments`对象并不像普通函数那样直接反映函数调用时传入的参数。在这种模式下,...
var func3 = function func4() {}; ``` 3. **`Function`构造函数**: ```javascript var func5 = new Function(); ``` #### 三、`Function`构造函数详解 `Function`构造函数允许开发者通过字符串来创建一个...
if (typeof define === "function" && (define.amd)) { define( "jquery", [], function() { return jQuery; }); } ``` 这段代码检查`define`函数是否存在并且其`amd`属性是否为真,如果满足条件,就会定义一个...
let func = function() {}; console.log(typeof func); // 输出 "function",但实际上func是一个函数对象 let nullValue = null; console.log(typeof nullValue); // 输出 "object",但null不是一个对象 ``` 接...
3. 命名函数表达式:`var func3 = function func4(…){…}`(这里的`func4`仅在函数体内部可用) 4. `Function`构造函数:`var func5 = new Function();` 接下来,我们将讨论函数的三种调用模式: 1. **方法调用...
杂工是的叉子安装npm install handymanbower install handyman用法承诺: var square = handyman ( function ( number ) { var deferred = this . defer ( ) ; if ( typeof number === 'number' || number ...
在继续讲述之前,先看一下函数的使用语法: 以下是引用片段: 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
== null && typeof result === "object") || typeof result === "function") { return result; } return obj; } ``` 在上面的自定义`_new`函数中,我们首先创建了一个新对象`obj`,其原型指向了构造函数`Func`的...