码迷,mamicode.com
首页 > 其他好文 > 详细

函数进阶

时间:2020-06-04 18:09:32      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:==   声明   允许   调用函数   注意   添加   代码块   实例   OLE   

## 函数定义方式

    - 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

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

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

        [动态添加属性来记录]

        [闭包]

## 函数同步异步问题

函数进阶

标签:==   声明   允许   调用函数   注意   添加   代码块   实例   OLE   

原文地址:https://www.cnblogs.com/macro-renzhansheng/p/13045095.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!