js 代码人生

74 阅读4分钟

今天们来探讨js中的函数相关问题

首先函数分为两个阶段

定义阶段 调用阶段

创建一个函数

声明式函数创建

function fn(){
 console.log('我执行了')
 }
 fn()

赋值式函数创建

var fn = function () {
console.log('我是函数fn')
}
fn()

fn()为函数调用,只有函数调用才能执行函数体的代码

浏览器做变量提升

浏览器做变量提升是指,浏览器会把声明式函数提升到script的最顶部位置,所以声明式函数可以在函数定义前调用函数,而赋值式函数则不可以会报错打印fn is not a function,原因在于在经过变量提升,值为undefiend

fn()
var fn = function () {
console.log('我是函数fn')
}
 fn()
function fn(){
 console.log('我执行了')
 }

函数的参数

函数的参数分为两个 形参(写在函数定义时的那个小括号内) 实参 (写在函数调用时的那个小括号内)


function fn(a,b){
 console.log('a,b')
 }
  fn(100,200)

此时打印出a的值为100 b的值为200

当函数的形参多于实参那么多余的形参的值为undefiend

当函数形参少于实参的时候那么多余的实参将无法通过形参来获取

注意两者是一一对应的关系

函数的返回值

案例 计算 a + b 的值


function fn(a,b){
   return a + b
 }
 var res = fn(100,200)

函数返回值的关键字 return

注意,return 有中断函数执IM行的效果,一定要放到代码最后

一定要定义一个变量来接收函数返回值,具体原因,稍后会讲

作用域

作用域有两个 全局作用域 私有(局部)作用域

全局作用域是script标签内的

私有作用域是写在函数里面的

域解析

console.log(num)//undefiend
var num = 100;
console.log(num)//100

域解析是将var关键字和function关键字的变量进行提升(注意提升的是变量不是变量的值) 函数提升的时候会将函数体进行提升,在函数没有调用之前以字符串的形式存储 如果函数体内也有普var function关键字会在函数调用的时候进行域解析


function fn(a,b){
 console.log(a,b)
 }
  fn(100,200)

页面一加载,首先会被提升到页面最上面,浏览器在真正就会执行代码就会执行之前就知道fn()是一个函数,fn()函数就会执行

var fn = function () {
console.log('我是函数fn')
}
fn()

而赋值式变量就会把赋值号左边的变量进行提升,在进行与解析的时候就会将fn变量提升到浏览器最前面,此时的fn是变量,代码从上而下执行,fn是一个变量,不是函数,所以会报错 fn is not a function 域解析案例

var num = 20
function fn(){
var a = 30
 console.log(a)//30
   function fnn (){
    var n = 50
    console.log(n)//50
    }
   fnn()
 }
  fn( )

第一次执行var num进行与解析赋值为20,然后是函数fn,直到遇到fn()函数调用的时候执行函数体里面的代码 第二次执行var a进行与解析赋值为30,然后是函数fn,console.log(a)输出30 第三次执行函数fnn进行域解析知道遇到fnn()执行函数体内的代码 var n 进行域解析,将变量n赋值为50 console.log(n)打印50 所以输出的值为 a = 30 b = 50

递归函数 通俗点说就是函数内部调用函数,也即是函数自己调用自己 函数内一定要有结束条件否则就是死递归 案例求1到5的和

        function fn(n) {
            if (n === 1) {
                return 1
            } else {
                return n + fn(n - 1)
            }
        }    
            var res = fn(5)
            console.log(res)

分析 结果为 5+4+3+2+1 也就是说 5+fn(4) 4+fn(3) 3+fn(2) 2+fn(1) fn(1) === 1 第一次执行,n = 5 不满足条件n === 1 return 5 + fn(4) 第二次执行,n = 4 不满足条件n === 1 return 4 + fn(3) 第三次执行,n = 3 不满足条件n === 1 return 3 + fn(2) 第四次执行,n = 2 不满足条件n === 1 return 2 + fn(1) 由于fn(1) = 1 fn(2) = 3 fn(3) = 6 fn(4) = 10 fn(5) = 15 所以结果为15