关于JavaScript函数

103 阅读2分钟

一、命名函数与匿名函数表达式

2.png

观点:当使用了命名函数表达式以后

全局执行上下文中,不再保留着命名函数test1的变量。
但是函数执行上下文中,依然保留着命名函数test1的变量。

二、形参与实参

基本数据类型:

有实参无形参,使用全局执行上下文中没有定义的变量,会产生报错。
无实参有形参,使用形参(全局执行上下文中有定义o无定义),都是undefined。
函数上下文,更改形参,入参也会更改。 引用数据类型:
有实参无形参,使用全局执行上下文中没有定义的变量,会产生报错。
无实参有形参,使用形参(全局执行上下文中有定义o无定义),都是undefined。
更改形参内的参数,实参也会跟着改变,但是如果直接更改形参的地址,入参并不会改变! 观点:
函数的形参和入参的关系,实际上是映射的关系,并不完全是同一个东西。

// 基本数据类型 - 正常使用
        var test_a = 1;
        var test_b = 2;
        function test(a,b) {
            console.log(arguments);// 输出 arguments [1,2]
            console.log(a, b)// 输出 1 2
        }
        test(test_a, test_b);
        console.log(test_a, test_b); // 输出 1 2
        
// 基本数据类型 - 有形参无实参1
        var a = 1;
        var b = 2;
        function tests(a, b) {
            console.log(arguments);// 输出 arguments []
            console.log(a, b);// 输出 undefined undefined
        }
        tests();

// 基本数据类型 - 有形参无实参2
        var test1_a = 1;
        var test1_b = 2;
        function test1(a, b) {
            console.log(arguments);// 输出 arguments []
            console.log(a, b);// 输出 undefined undefined
        }
        test1();
        console.log(test1_a, test1_b); // 输出 1 2

// 基本数据类型 - 无形参有实参
        var test2_a = 1;
        var test2_b = 2;
        function test2() {
            console.log(arguments);//// 函数内部报错,后续代码停止运行
            console.log(a, b);// Uncaught ReferenceError: a is not defined
        }
        console.log(test2_a, test2_b);; // 输出 1 2
        test2(test2_a, test2_b);
        console.log(test2_a, test2_b); // 函数内部报错,后续代码停止运行

// 基本数据类型 - 有形参有实参  函数执行上下文改变形参
        var test3_a = 1;
        var test3_b = 2;
        function test3(a, b) {
            console.log(arguments);// 输出 arguments [1,2]
            a = 3;
            console.log(arguments);// 输出 arguments [3,2]
            console.log(a, b);// 输出 3 2
        }
        console.log(test3_a, test3_b); // 输出 1 2
        test3(test3_a, test3_b);
        console.log(test3_a, test3_b); // 输出 1 2


// 引用值-正常使用
        var test_arr = [1, 2, 3];
        function test(arr) {
            console.log(arr);// [1, 2, 3]
        }
        console.log(test_arr);// [1, 2, 3]
        test(test_arr);
        console.log(test_arr);// [1, 2, 3]

// 引用值-有形参无实参
        var test1_arr = [1, 2, 3];
        function test1(arr) {
            console.log(arguments);//[[1,2,3]]
            console.log(arr);// undefined
        }
        console.log(test1_arr);// [1, 2, 3]
        test1();
        console.log(test1_arr); //  [1, 2, 3]



// 引用值-无形参有实参
        var test2_arr = [1, 2, 3];
        function test2() {
            console.log(arguments); // 函数内部报错,后续代码停止运行
            console.log(arr);// Uncaught ReferenceError: arr is not defined
        }
        console.log(test2_arr);// [1, 2, 3]
        test1(test2_arr);
        console.log(test2_arr); // 函数内部报错,后续代码停止运行

// 引用值-函数执行上下文更改形参引用值内参数
        var test3_arr = [1, 2, 3];
        function test3(arr) {
            console.log(arguments); // [[1,2,3]]
            arr.push(4);
            console.log(arguments); // [[1,2,3,4]]
            console.log(arr);// [1, 2, 3, 4]
        }
        console.log(test3_arr);// [1, 2, 3]
        test3(test3_arr);
        console.log(test3_arr); // [1, 2, 3, 4]

// 引用值- 直接在函数执行上下文内更改形参地址
        var test4_arr = [1, 2, 3];
        function test3(arr) {
            console.log(arguments); // [[1,2,3]]
            arr = [];
            console.log(arguments); // []
            console.log(arr);// []
        }
        console.log(test4_arr);// [1, 2, 3]
        test3(test4_arr);
        console.log(test4_arr); // [1, 2, 3]