zoukankan      html  css  js  c++  java
  • 函数进阶

    ## 函数定义方式

        - function XX(){

        }

        - 函数表达式(匿名函数)

            var fn = function(){}

        - new function()

            var func = new Function('a', 'b', 'console.log(a + b)');

            func(3, 6);

            func.__proto__ === Function.prototype

        con: 所有函数都是Function的实例,函数也是对象。

            Function  --->   Function.prototype

    ##  函数的调用方式和this

        普通函数调用                                    window对象

        1.对象调用                                      obj

            obj.func()

        2.构造函数调用                      ---         实例对象

            new Func()

        3.事件触发调用                                  绑定事件对象

            btn.onclick = func;

        4.定时器函数调用                                window对象

            setInterval(function(){

                console.log(1);

            });

            同理,setTimeout(function(){

                console.log(1);

            });

        5.匿名函数调用————函数定义后立即执行              window对象

            (function(){

                console.log(124);

            })();

    ##  更改函数中 this 指向问题

        call()          this指向之后的参数是逗号隔开,调用函数执行

        apply()         this指向之后的参数是数组,调用函数执行

        bind()          不会调用函数执行

    ## 严格模式

    在严格条件下执行JS代码,

        1:禁止变量没有声明就赋值,变量必须先定义后赋值

        2:禁止删除已经声明的变量

        3:全局作用域中函数的this是 undefined

        4: 构造函数,正常模式支持:Student('macro'),不加new 调用,支持 this.name = name;

            但严格模式 this undefined

        5: 严格模式下 参数名不能重复

        6:不允许在非函数代码块中定义代码

            if(true){

                function fun(){

                    console.log(123);

                }

            }

            但是这种是允许的:

            function fun(){

                function func1(){

                    console.log(456);

                }

            }

    ## 高阶函数

        函数的参数是函数,或者返回值是函数

        function fn(){

            return function(){

                console.log(123);

            }

        }

    深拷贝:

    <script>

    var obj = {

    a: 10,

    b: 20,

    info: {

    c: 30

                }

            };

    function deepCopy(target, source) {

    for (var key in source) {

    // console.log(key, source[key]);

    var item = source[key];

    if (item instanceof Array) {

    target[key] = [];

    deepCopy(target[key], item);

                    } else if (item instanceof Object) {

    target[key] = {};

    deepCopy(target[key], item);

                    } else {

    target[key] = item;

                    }

                }

            }

    var target = {};

    deepCopy(target, obj);

    console.log(target);

    </script>

    原理还不够清晰

    bind()应用

    <script>

    var btn = document.querySelector('#btn');

    var num = 10;

    btn.onclick = function() {

    this.innerHTML = "剩余 " + num + " S";

    setInterval(function() {

    this.innerHTML = "剩余 " + --num + " S";

                }.bind(this), 1000);

            }

    </script>

    apply bind call  --注意用法

    function fn(a, b) {

    console.log(this);

    console.log(a, b);

            }

    var obj = {

    a: 10

            }

    fn.apply(obj, [1, 2]);

    fn.call(obj, 3, 4);


    //必须有指向对象this ,

    var max = Math.max.apply(null, [2, 3, 6, 8, 5]);

    console.log(max);

    var arr = [45, 23, 54, 67, 88];

    var max = Math.max.apply(null, arr);

    console.log(max);

    //call apply bind区别

    //返回由指定this值和初始化参数改造的原函数拷贝

    var newFunc = fn.bind(obj, 3, 4);

    newFunc();

    ##  闭包

        - 全局作用域    局部作用域

        - 正常模式下,局部作用域变量在全局内不可见 undefined

        - 闭包:全局内有权利访问另一个函数作用域中的变量的函数。

            -闭包 可以延伸变量作用范围

            [动态添加属性来记录]

            [闭包]

    ## 函数同步异步问题

  • 相关阅读:
    编程之美--2.13
    编程之美--2.17
    编程之美--3.8
    编程之美--3.7
    面试金典--9.3
    面试金典--9.2
    面试金典--9.1
    jq插件
    laravel controller
    laravel 登录验证
  • 原文地址:https://www.cnblogs.com/macro-renzhansheng/p/13045095.html
Copyright © 2011-2022 走看看