函数
基本的函数写法
/*
function 命令 函数声明
*/
function test () {
...
}
/*
函数表达式
*/
var test = function() {
...
}
匿名函数表达式
var test1 = function test() {
}
console.log(test1.name)
/*
构造函数
*/
var Persion = new Function () {
}
参数 形参,实参,arguments
形参,实参
// 占位 -> 形式上占位,形参
function test (a,b) {
console.log(a + b)
}
test(1,2) // 实参
arguments
- 形参和实参是对应的.
- 形参和实参的数量可以不等。
- 在函数内部可以通过arguments获取传递过来了的实参
// 累加函数的实参值
function sum() {
var a = 0;
for (var i = 0; i < arguments.length; i++) {
a += arguments[i]
}
console.log(a)
}
sum(1,2,3)
// 形参和实参和arguments对应的值的更改是同步的
// 这里形参a = 3 是在栈内存
// arguments[0] 这个是在堆内存的
// 这里的实参和形参是有映射关系的
function test (a, b) {
a = 3;
console.log(arguments[0]) // 3
}
test (1,2)
function test1(a,b) {
b = 3;
console.log(arguments[1]) // undeinfed
}
test1(1)
// 这种赋值默认值的方式在es6中
function test (a = 1, b) {
console.log(a) // 2
console.log(b) // unefined
}
// es5中可以曲线救国
function test (a,b) {
var a = arguments[0] || 1
var b = arguments[1] || 2
return a+b
}
test(2)
test(undefined,2) // 1,2
虽然形参和实参存在映射关系,但是如果一个有默认值,但是一个确实undefined,那就取有值的
- arguments 虽然arguments很像数组,但它是一个对象
- 数组专有的方法(比如slice和forEach),不能在arguments对象上直接使用。
- 如果要让arguments对象使用数组方法,真正的解决方法是将arguments转为真正的数组。
var args = Array.prototype.slice.call(arguments);
// 或者
var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
递归(函数可以调用自身)
找到规律,并找到边界
/*
斐波那契
1,1, 2, 3, 5, 8
1,1,1+1,1+2,2+3,3+5
*/
function fib(num) {
if (num === 0) return 0
if (num === 1) return 1
return fib(num - 2) + fib(num -1)
}
/*
n的阶乘
n! = n*(n-1)!
*/
function fact(n) {
if (n === 0) return 0
if (n === 1) return 1
reutrn n*fact(n-1)
}
函数第一等公民
- JavaScript 语言将函数看作一种值,与其它值(数值、字符串、布尔值等等)地位相同。
- 凡是可以使用值的地方,就能使用函数。比如,可以把函数赋值给变量和对象的属性,也可以当作参数传入其他函数,或者作为函数的结果返回.
函数的属性和方法
- name 返回函数的名字
functino f1() {}
f1.name // f1
var f2 = function () {}
f2.name // f2
var f3 = function myName(){}
f3.name // myName
- length 属性, 函数的length属性返回函数预期传入的参数个数,即函数定义之中的参数个数。形参的个数
function f(a,b){}
f.length // 2
- length属性提供了一种机制,判断定义时和调用时参数的差异,以便实现面向对象编程的“方法重载”(overload)
函数的作用域已经在前面的作用域部分都做了分析了。
function test(name){
reutrn num || 'default' // ||只要当前是假就往后走
return num && 'default' // && 只要当前是真就往后走
}
// 为假的判断:undefined null 0 false '' 0 NaN
// 其他的都为真
test('ddd') // ddd
立即执行函数 IIFE (初始化函数)
- 自动执行
- 执行完成后立即释放
(function(){
})()
var test = function(){
console.log(1)
}()
// 一定是表达式才能被执行符号执行。
function test(){
}() // 这个会报引用错误
想让这个不报错,可以把test变成一个表达式 + - ! || &&
+ function test(){
}()
function test(a){
}(6) // 这个就会被浏览器解析为表达式
// 下面的例子证明:自动执行,执行完后立即释放
var test1 = function(){
console.log(1)
}()
// 1
console.log(test1) // undefined
逗号运算
console.log((6,5)) // 5 后面的会覆盖前面的