JavaScript 函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
    <script>
        /* 函数第一种声明 */
        var abc;
        abc = function (a, b) {
            alert(a + b);
        }
        abc(1, 3);

        /* 函数第二种声明 */
        var c = 5, d = 6;
        test(c, d);
        function test(c, d) {
            alert(c + d);
        }

        /* 在js的函数里面还可以定义函数(私有函数) */
        function testaaa() {
            var res = add(2, 2);
            function add(a, b) {
                return a + b;
            }
            return res;
        }
        alert(testaaa());

        /* 匿名函数第一种用法 赋值给变量,赋值给对象的属性 */
        var abc;
        abc = function (a, b) {
            alert(a + b);
        }
        abc(1, 3);

        /* 匿名函数第二种用法 作为参数传入函数,类似回调函数 */
         function test(a, b, f) {
           return f(a, b);
        }

        function add(a, b) {
            return a + b;
        }
        alert(test(2, 3, function (a, b) {
            return a + b;
        }));

        /* 匿名函数第三种用法 作为命名空间,定义完后直接调用 */
        /* 匿名函数第一种调用方法 */
        !function () {
            function a()
            {
                alert("我是a函数!");
            }
            function b()
            {
            }
            function c()
            {

            }
            a();
        }();

        /* 匿名函数第二种调用方法 */
        (function () {
            function a()
            {
                alert("我是a函数!");
            }
            function b()
            {
                alert("我是b函数!");
            }
            function c()
            {

            }
            b();
        })();

        /* 匿名函数第三种调用方法 */
        (function () {
            function a()
            {
                alert("我是a函数!");
            }
            function b()
            {
                alert("我是b函数!");
            }
            function c()
            {
                alert("我是c函数!");
            }
            c();
        }());
        
        /* 匿名函数的传参 */
        !function (a, b) {
            alert(a + b);
        }(2, 4);

        /* 在外部间接调用私有属性和函数的第一种方法 */
         返回一个函数
         var md5 = function () {
            function a()
            {
                alert("我是a函数!");
            }
            function b()
            {
                alert("我是b函数!")
            }
            function c()
            {
                alert("我是c函数!")
            }
            return a;
        }();
        md5();

        /* 返回多个接口 */
        var md5 = function () {
            function a()
            {
                alert("我是a函数!");
            }
            function b()
            {
                alert("我是b函数!")
            }
            function c()
            {
                alert("我是c函数!")
            }
            return {
                a : a,
                b : b,
                c : c
            };
        }();
        md5.a();
        md5.b();

        /* 在外部间接调用私有属性和函数的第二种方法 */
        var obj = {};
       !function () {
            function a()
            {
                alert("我是a函数!");
            }
            function b()
            {
                alert("我是b函数!")
            }
            function c()
            {
                alert("我是c函数!")
            }
           obj.a = a;
           obj.b = b;
           obj.c = c;
        }();
       obj.a();
       obj.b();

        /* 在外部间接调用私有属性和函数的第三种方法(1) */
       !function () {
            function a()
            {
                alert("我是a函数!");
            }
            function b()
            {
                alert("我是b函数!")
            }
            function c()
            {
                alert("我是c函数!")
            }
           window.a = a;
           window.b = b;
           window.c = c;
        }();
       a();
       c();

       /* 在外部间接调用私有属性和函数的第三种方法(2) */
       !function (w) {
            function a()
            {
                alert("我是a函数!");
            }
            function b()
            {
                alert("我是b函数!")
            }
            function c()
            {
                alert("我是c函数!")
            }
           w.a = a;
           w.b = b;
           w.c = c;
        }(window);
       c();

       /* js当中没有函数重载 */
        /* js支持可变参数 */
        function test() {
            alert(arguments.length);
        }
        test(1, 2);
        function test() {
            alert(arguments[1]);
        }
        test(1, 3);

        // 在顶层代码引用this 就代表Window ,函数里的this,谁调用它,就代表谁
        var a = 100;
        alert(this.a);

        var a = 200;
        function test() {
            var a = 100;
            alert(this.a);
        }
        window.test();

        var x = 2000;
        var obj1 = {
            x : 1000,
            y : function () {
                alert(this.x);
            }
        };
        var obj2 = {
            x : 3000,
            y : function () {
                alert(this.x);
            }
        };
        alert(this.x);
        obj1.y();
        obj2.y();

        //  ECMAScript规范所有函数都包含两个非继承的方法,分别为call()和apply(),这两个函数都是在特定的作用域中调用函数,能改变函数的作用域,实际上是改变函数体内“this”的指代的对象。
        /* 函数也是对象,它也有属性和方法,最常用的方法是call 和 apply */
        function test(a, b) {
            alert(a + b);
            alert(this.x);
        }
        var obj1 = {
            x : 1000,
            y : function () {
                alert(this.x);
            }
        };
        var obj2 = {
            x : 3000,
            y : function () {
                alert(this.x);
            }
        };
        // call 方法有好几个参数,第一个是对象,剩下的都是传给这个函数的参数
        // test.call(obj1);
        test.call(obj2, "张三", "李四");
        // apply 只有两个参数,第一个是对象,第二个是数组
        test.apply(obj1, ["张三", "王五"]);

        // 闭包
        function test() {
            var a = 100;
            return function () {
                return a;
            }
        }
        var abc = alert(test()());
    </script>
</body>
</html>

需要注意的是 Javascript 里面没有函数重载。

posted @ 2019-10-19 10:45  李道臣  阅读(120)  评论(0编辑  收藏  举报