分配应用于变量

时间:2016-10-04 07:46:42

标签: javascript apply

任何人都知道为什么在javascript中这是有效的

m = Math.max
m.apply(null, [1,2,3])

但这不是吗?

m = Math.max.apply
m(null, [1,2,3])

抛出异常:

  

TypeError:在undefined上调用了Function.prototype.apply,这是一个未定义的而不是函数

2 个答案:

答案 0 :(得分:4)

根据spec

  
      
  1. 如果IsCallable(func)为false,则抛出TypeError异常。
  2.   

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不知道它必须调用哪个函数。