为什么不能给call, apply声明变量?
var getTypeStr = Object.prototype.toString.call;
getTypeStr({}); // 你认为结果是什么?
为什么呢?
9 回复
toString.call 他是基于构造函数去调用的, 也应该算是函数内部的. 所以你根本没有必要纠结这个问题. 他就是这么特殊.
@danielsss 不明白…
根据ecma-262的规范,call方法需要在func对象上调用。当IsCallable(func)为false的时候,会抛出TypeError。所以chrome中的错误是:TypeError: undefined is not a function
http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4.4
var type = function(obj) {
var map = {
'[object Array]': 'array',
'[object Object]': 'object',
'[object String]': 'string',
'[object Number]': 'number',
'[object Boolean]': 'boolean',
'[object Null]': 'null',
'[object Function]': 'function'
};
var t = Object.prototype.toString.call(obj);
return map[t];
}
根据你代码的意思,你可能是需要类似于这种功能。希望对你有帮助。
@ruanyl 赞!
@ruanyl 赞!
@ruanyl 还可以加一个 '[object Undefined]'
,谢谢!
var getTypeStr = Object.prototype.toString.call.bind(Object.prototype.toString);
这样就可以了。 @ruanyl 说得很靠谱,所以如果不做bind,getTypeStr就是没有指定一个方法的call(call执行时的this不是一个函数),所以会报错。
炒冷饭的bind