任何人都知道为什么在javascript中这是有效的
m = Math.max
m.apply(null, [1,2,3])
但这不是吗?
m = Math.max.apply
m(null, [1,2,3])
抛出异常:
TypeError:在undefined上调用了Function.prototype.apply,这是一个未定义的而不是函数
答案 0 :(得分:4)
根据spec
- 如果IsCallable(func)为false,则抛出TypeError异常。
醇>
func
是调用apply
方法的对象。
apply
允许您稍后指定function
的上下文,在您的情况下为undefined
,因为m
没有功能 context(应该在参数中指定)。
自参数
未捕获TypeError:在undefined上调用Function.prototype.apply, 这是一个未定义而不是函数
您可以尝试以下
进行测试示例1:
m = Math.max.apply.bind(this)
m(this, [1,2,3])
未捕获的TypeError:调用了Function.prototype.apply ,这是一个对象,而不是一个函数
示例2:
m = Math.max.apply.bind(null)
m(this, [1,2,3])
未捕获的TypeError:调用了Function.prototype.apply null,这是一个对象而不是一个函数
示例3 :( 由于指定了函数上下文,因此不会出错)
m = Math.max.apply.bind(function(){})
m(this, [1,2,3])
未定义
示例4 :(最后这会为您提供所需的输出)
m = Math.max.apply.bind(Math.max)
m(this, [1,2,3])
3
答案 1 :(得分:1)
要理解第二个示例失败的原因,您必须了解Javascript中的函数上下文。在Javascript中,方法就像发送到它们被调用的对象的消息。它们被调用的对象是它们的上下文,因此该对象将是函数体内this
的值。
apply
是一个特殊函数,它允许您将此上下文设置为第一个参数,然后其余参数将是应用的函数的参数 {{1在你的例子中。但同时需要在函数对象上调用Math.max
才能工作。在第二个示例中,您在apply
变量中存储了对apply函数的引用,并且您在没有上下文的情况下调用它,因此它失败,因为apply不知道它必须调用哪个函数。