【2020Python修炼记】前端开发之 JavaScript 函数 一、JavaScript 函数 二、JavaScript 作用域

【目录】

一、JavaScript 函数

1、声明函数的方法

2、参数问题

3、回调函数

4、递归函数

5、自调函数

6、闭包函数

二、JavaScript 作用域

1、局部作用域

2、全局作用域

3、作用域链

4、块状作用域(ES6)

1、声明函数的方式

(1)function 关键字

(2)匿名函数方式(表达式方式)

(3)Function构造函数方法

2、参数问题

(1)形参和实参数量问题

(2)可选形参(参数默认值)

(3)可变长的实参列表:实参对象 arguments

3、回调函数

一个函数可以接收另一个函数作为参数,这种函数就是回调函数(高阶函数)

function add(x, y, f) {
    return f(x) + f(y);
}
add(-5, 6, Math.abs)

4、递归函数

函数内部自己调用自己

//用递归 实现阶乘
function multiply(n) {
    if (n == 1) {
        return 1
    }
    return n * multiply(n - 1)
}

5、自调函数

函数声明完,直接调用

(function(){
    console.log('ok')
})()

6、闭包函数

当一个函数返回了一个函数后,其内部的局部变量还在被新函数引用着,形成闭包

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push((function (n) {
            return function () {
                return n * n;
            }
        })(i));
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

f1(); // 1
f2(); // 4
f3(); // 9

二、JavaScript 作用域

1、局部作用域

一般在函数内定义的变量就是局部变量,仅供函数内部使用

2、全局作用域

在函数之外定义的变量就是全局变量,哪里都能使用

【变量提升】

var a = 100
function demo(){
    console.log(a)
    var a = 200
}

3、作用域链

函数嵌套会形成作用域链

function demo(){
    function fn(){
        function fn1() {

        }
    }
}

4、块状作用域(ES6)

使用 let 关键字声明的变量会具有块状作用域

for (let i = 0; i < 10; i ++) {

}

console.log(i) //变量不存在 Uncaught ReferenceError: i is not defined