什么被传递到这个'功能(x)'?

时间:2016-02-24 19:07:14

标签: javascript math

我很难掌握javascript的一些细节,我有这个函数function(x)它似乎没有接收到任何参数。也许我不理解Math.sin部分。我不确定。关于发生了什么的任何想法?

function makeDerivative( f, deltaX )
     {
        var deriv = function(x) // x isn't designated anywhere
        { 
           return ( f(x + deltaX) - f(x) )/ deltaX;
        }
        return deriv;
    }
    var cos = makeDerivative( Math.sin, 0.000001);
    // cos(0)     ~> 1
    // cos(pi/2)  ~> 0

更新 我尝试了这个并获得了NaN,然后​​是15

function addthings(x, y)
    {
                var addition = function(m)
          {
                return( x + y + m);
          }
          return addition;
    }

    var add = addthings(5, 5);
    alert(add());
    alert(add(5));

4 个答案:

答案 0 :(得分:2)

外部函数返回内部函数,因此传递给所有内容 cos后来理论上是你传入内部函数的。想象一下这样称呼它:

console.log(makeDerivative( Math.sin, 0.000001)(0)); // 1

会输出相同的内容,就像您按照描述

进行操作一样
console.log(cos(0)) // 1

cos分配对函数的引用(makeDerivative返回的函数)。

答案 1 :(得分:2)

要了解该代码的工作原理,您必须详细了解currying in functional javascriptfunctions closures

答案 2 :(得分:2)

其他答案触及了这个问题,但我将尝试找到它的核心。

JavaScript变量是无类型的,这意味着它们可以动态地更改它们是什么类型的变量。在一个简单的层面上,这意味着var a可以实例化为数组,然后在运行时将其指定为字符串。

但您也可以将整个函数存储在这些无类型变量中。例如;

var test = 'hey'
console.log(test)      //:: hey
test = function(input){ console.log('inner function: ' + input) }
console.log(test) //:: function(input){ console.log('inner function' + input) }
test() //:: inner function
test('with input') //:: inner function with input

// :: _____表示控制台的输出。

所以你正在使用的函数返回另一个动态函数。然后,您可以正常方式调用 功能,并在调用时输入x的值。

答案 3 :(得分:1)

好吧,你并没有真正调用你发布的代码中的函数。

makeDerivative引用Math.sin函数,并在其中使用它来创建函数的引用,该函数计算传递函数的推导(参见f参数)。

在您的示例中,此引用已分配给cos变量。如果你用(0)参数调用它,你将获得1作为返回值,并且参数(0)将被传递到该派生函数...