我很难掌握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));
答案 0 :(得分:2)
外部函数返回内部函数,因此传递给所有内容
cos
后来理论上是你传入内部函数的。想象一下这样称呼它:
console.log(makeDerivative( Math.sin, 0.000001)(0)); // 1
会输出相同的内容,就像您按照描述
进行操作一样console.log(cos(0)) // 1
为cos
分配对函数的引用(makeDerivative
返回的函数)。
答案 1 :(得分:2)
要了解该代码的工作原理,您必须详细了解currying in functional javascript和functions 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
)将被传递到该派生函数...