Appearance
计算
编程语言是人与计算机打交道的一个重要工具。
计算机(Computer)是干嘛的?当然是计算(Computing)啦。
在浏览器的控制台输入以下代码:
javascript
1 + 1
是不是有看到浏览器在回应你:2
。这里基本上是能够当成一个计算器用的。
没错,这就是计算嘛。
然而,有什么用呢?
计算
简(pian)单(mian)地讲,一切问题都能抽出来一套数学模型,同样能够抽出来的数学模型都可以转化成计算问题,然后让计算机来解决。
所以计算可以看成是整个程序设计的基础。同样像我们之前提到的,计算机,本身也就是拿来做计算的。
那么我们都可以做哪些计算呢?
当然普通的
javascript
function pow5(num) {
return num * num * num * num * num;
}
比如pow5
的意思就是求一个数的5次方。我们定义了一个函数,怎么用呢?
然后尝试下面的代码:
javascript
pow5(1)
嗯,没错,输出了我们期望的结果(1
)。
组合
什么是组合呢?
想想我们学习函数和多项式的时候,
然后我们要定义一个
我们首先要把
即
好吧我编不下去了。总之展开来以后很丑的。
而且如果以后遇到
但是在JavaScript里面我们并不用担心这个问题。
比如我们有两个函数
javascript
function f(x) {
return x*x + 2*x + 1;
}
function g(x) {
return (x+3) * (x-5);
}
那么我们的
javascript
function h(x) {
return f(g(x));
}
或者你也可以不用专门去定义,在用到的时候直接用就可以:
javascript
f(g(5))
// or
h(5)
组合的意义
比如我们可以考虑一个更复杂的函数,
当
总之,无论他有多长,都会在算式里面充斥着
于是pow5
那种情况,更是会被求值5次。
令人欣慰的是,组合帮我们保证了这个问题不会有这些重复。
当你计算pow5(3+1)
的时候,JavaScript并不会去展开成(3+1)*(3+1)...*(3+1)
这种形式,而是直接变成了pow5(4)
,最后的结果是1024。
也就是说,函数的每个自变量(编程语言里面我们会把他们叫做参数(argument))会先被求值,得到他们的值以后才会带入计算。
*请记住我们现在讨论的这个问题,后面会展开并且深入地探讨。
练习
- 请思考,如果函数的参数在代入函数之前并不进行强制求值,
pow5(pow5(pow5(pow5(5))))
展开后共计算多少次乘法。 - 强制求值可能会造成的问题有哪些。