JavaScript基础2-函数

定义使用

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一直保存在内存中。所以闭包的作用就是访问内部变量和让变量保存在内存中,但因此使用不当会引起性能问题。


参考文档
* https://developer.mozilla.org/cn/docs/Web/JavaScript/Closures
* http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
* http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html
* https://www.cnblogs.com/coco1s/p/4833199.html

CONTENTS