函数基础部分和立即执行函数

函数

基本的函数写法
/*
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 后面的会覆盖前面的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值