定义使用
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
- function全名,go中
func
,python使用def
- 不需要说明是否有返回值,使用return返回或者停止执行,否则返回undefined
- 传入参数比定义少时,并且函数中使用到了,则返回NaN或者undefined
调用函数:函数名传入参数即可,arguments可以获取当前函数的参数,rest允许接收任何参数。
function foo(a, b, ...rest) {
}
函数内部变量的作用域只在函数内,相互不影响,如果是内部函数,则何以访问外部,且内部屏蔽外部。声明在函数外的变量即为全局变量,属于Windows的变量,函数本身也是一个全局变量。
既然定义的函数也是一个全局变量,那么引入不同的js文件就会存在冲突,所以需要定义自己的命名空间。命名空间也容易引起混乱,最好使用CMD/AMD规范(AMD规范)。
还有一点,js在函数内定义的变量对整个函数都生效,不像java那样只是{}
内的局部变量,ES6引入let
声明的变量为块级变量。其中常量也需要ES6后的关键字const
。
js中使用this
是个大坑,不小心就会出错(this可能指向Windows而不是对象),一般都会声明一个变量先别this存起来使用。或者使用apply()
。
高阶函数
高阶函数就不细说了,只要支持函数式编程的语言几乎都支持map,reduce和filter,sort等高阶函数。
一个简单示例:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arr.map(function(x){
return x +10
}))//[11, 12, 13, 14, 15, 16, 17, 18, 19]
arr.map(x => x + 5) // lambda表达式(java中是->)
闭包
函数式编程中,函数可以作为一个返回值存在,可以延迟执行。前面说,JavaScript中的外部函数不能访问内部函数变量,那如何从外部读取内部变量呢,就是函数再定义一个内部函数作为返回值。
function outter() {
let x = "outter"
return () => console.log(name)
}
var f = outter()
f()// outter
这个示例就是能访问内部变量的闭包,那再看一个示例。
function persion() {
var age = 12
return () => console.log(age += 10)
}
var p = persion()
p()//22
p()//32
执行两次调用后,age值变了,说明age一直保存在内存中。所以闭包的作用就是访问内部变量和让变量保存在内存中,但因此使用不当会引起性能问题。
参考文档