为什么不能给call, apply声明变量?
发布于 10 年前 作者 think2011 4259 次浏览 最后一次编辑是 8 年前 来自 问答
var getTypeStr = Object.prototype.toString.call;
getTypeStr({}); // 你认为结果是什么?

为什么呢?

9 回复

toString.call 他是基于构造函数去调用的, 也应该算是函数内部的. 所以你根本没有必要纠结这个问题. 他就是这么特殊.

根据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 还可以加一个 '[object Undefined]',谢谢!

var getTypeStr = Object.prototype.toString.call.bind(Object.prototype.toString);

这样就可以了。 @ruanyl 说得很靠谱,所以如果不做bind,getTypeStr就是没有指定一个方法的call(call执行时的this不是一个函数),所以会报错。

炒冷饭的bind

回到顶部