Eric实验室 2019-06-28
示例代码:
function fun() {
    console.log('一笑一人生');
}示例代码:
var fn = function () {
    console.log('一花一世界');
};
// 判断函数是否为Function类型的
console.log(fun instanceof Function);//调用结果为 true
console.log(fn instanceof Function);//调用结果为 true
//JavaScript中所有的函数都是Function类型的对象语法:
var 函数名 = new Function(参数,函数体);
示例代码:
var f = new Function('a','console.log(a)');
f(100);//以函数方式进行调用示例代码:
//1. Object与Function都是自身的类型 console.log(Object instanceof Object);//调用结果为 true console.log(Function instanceof Function);//调用结果为 true //2. Object自身是构造函数,而构造函数也是函数,是函数都是Function类型 console.log(Object instanceof Function);//调用结果为 true //3. Function是引用类型,用于创建对象,是对象都是Object类型 console.log(Function instanceof Object);//调用结果为 true
示例代码:
// 变量的声明提前
console.log(v);//调用结果为 undefined
var v = 100;
// 如果使用函数声明方式定义函数时 - 函数的声明提前
fun();//调用结果为 一花一世界
function fun() {
    console.log('一花一世界');
}代码的执行流程分析图:
apply(thisArg,argArray)方法 - 用于调用一个指定的函数
参数
示例代码:
// 定义函数
function fun(value) {
    console.log('一花一世界' + value);
}
//函数的调用方式
// 语法结构 : 函数名称()
fun('一笑一人生');//调用结果为 一花一世界一笑一人生
fun.apply(null,['一叶一孤城']);//调用结果为 一花一世界一叶一孤城Function的call()方法用于调用一个函数,并接收指定的this值作为参数,以及参数列表
示例代码:
//定义函数
function fun(value,value2) {
    console.log('一花一世界' + value + value2);
}
// 函数的调用方式
//语法结构 : 函数名称()
fun('一笑一人生','极乐世界');//调用结果为 一花一世界一笑一人生极乐世界
fun.apply(null,['一笑一人生','走你']);//调用结果为 一花一世界一笑一人生走你
// call()方法 - 用于调用一个函数
fun.call(null,'一笑一人生','一叶一菩提');//调用结果为 一花一世界一笑一人生一叶一菩提bind(thisArg,arg1,arg2,...)方法
参数
示例代码:
//定义函数
function fun(value) {
    console.log('一花一世界' + value);
}
/*
var f = fun.bind();// 相对于从指定函数复制一份出来
console.log(f);
f();*/
fun('一笑一人生');// 调用结果为 一花一世界一笑一人生
var f = fun.bind(null,'一叶一菩提');
f();// 调用结果为 一花一世界一叶一菩提重载的含义:
示例代码:
function add(a,b){
    return a + b;
}
function add(a,b,c){
    return a + b + c;
}
function add(a,b,c,d){
    return a + b + c + d;
}
//理想效果:
add(1,2);// 3
add(1,2,3);// 6
add(1,2,3,4);// 10
//实际效果:
// JavaScript的函数不存在重载 -> 当函数同名时,最后一次定义的函数有效
console.log(add(1,2));// NaN
console.log(add(1,2,3));// NaN
console.log(add(1,2,3,4));// 10JavaScript提供arguments对象
属性
示例代码:
function add() {
    var num = arguments.length;
    switch (num) {
        case 2:
            return arguments[0] + arguments[1];
            break;
        case 3:
            return arguments[0] + arguments[1] + arguments[2];
            break;
        case 4:
            return arguments[0] + arguments[1] + arguments[2] + arguments[3];
    }
}
console.log(add(1,2));//调用结果为 3
console.log(add(1,2,3));//调用结果为 6
console.log(add(1,2,3,4));//调用结果为 10示例代码:
function fun() {
    // 当前函数的逻辑内容
    console.log('this is function');
    // 调用自身函数 - 实现递归
    fun();
}
fun();控制台效果解析图:
示例代码:
function fn(v) {
    console.log(v);
    /* 语句判断 */
    if (v >= 10) {
    /* 结束语句循环 */
        return;
    }
    //fn(v + 1);
    arguments.callee(v + 1);
}
//fn(0);
var f = fn;
fn = null;
f(0);
console.log(f);控制台调用图:
匿名函数的作用:
示例代码:
// 作为另一个函数(fn)的参数的函数(one) - 回调函数
var one = function(){
    return 1;
}
function fn(v){
    return v();
}
// one函数仅是作为fn函数的参数出现 - 并不是调用
// var result = fn(one);
/*
    以上代码等价于以下代码
    以下代码中作为参数的函数 - 匿名回调函数
  */
var result = fn(function(){return 1;});
console.log(result);// 1回调函数分析图:
示例代码:
// 作为另一个函数(fn)的参数的函数(one) -> 回调函数
var one = function(w){
    return w;
}
function fn(v){// 形参是一个函数
    return v(100);// 函数的调用体
}
// var result = fn(one);// 实参必须是一个函数
var result = fn(function(w){return w;});
console.log(result);回调函数的参数的分析图:
自调函数 - 定义即调用的函数
示例代码:
// 全局作用域 - 生命周期:JavaScript文件从执行到执行完毕
(function(value){
    // 函数作用域 - 生命周期:从函数调用到调用完毕
    console.log('一花一世界' + value);
})('一叶一菩提');
// 表达式语法
(function(value){
    // 函数作用域 - 生命周期:从函数调用到调用完毕
    console.log('一花一世界' + value);
}('一笑一人生'));示例代码:
var one = function(){
    return 100;
};
// 作为值的函数 -> 内部函数的一种特殊用法
function fun(){
    var v = 100;
    // 内部函数
    return function(){
        return v;
    };
}
var result = fun();
console.log(fun()());// 调用结果为 100示例代码:
var a = 10;// 全局变量
function fun(){
    var b = 100;// fun函数作用域的局部变量
    // 内部函数
    function fn(){
        var c = 200;// fn函数作用域的局部变量
        // 内部函数
        function f(){
            var d = 300;// f函数作用域的布局变量
            // 调用变量
            console.log(a);// 10
            console.log(b);// 100
            console.log(c);// 200
            console.log(d);// 300
        }
        f();
        // 调用变量
        // console.log(a);// 10
        // console.log(b);// 100
        // console.log(c);// 200
        // console.log(d);// d is not defined
    }
    fn();
    // 调用变量
    // console.log(a);// 10
    // console.log(b);// 100
    // console.log(c);// c is not defined
    // console.log(d);// d is not defined
}
fun();作用域链的分析图:
闭包是什么:
示例代码:
var n;// 定义变量,但不初始化值
function fun() {// 函数作用域
    var v = 100;
    // 进行初始化值 - 一个函数
    n = function () {
        console.log(v);
    };
    // n();
}
fun();
n();// 调用结果为 100闭包的特点:
闭包的作用: