JavaScript进阶函数

1. 函数的定义和调用

1.1 函数的定义

1…自定义函数(Function命名函数)

function fn() {};

2.函数表达式 (匿名函数)

var fun = function() {};

3.利用 new Function()

var fn = new Function('参数1','参数2'..., '函数体')

4.对象的方法

对象的方法
        var o = {
            sayHi: function() {
                console.log();
            }
            sayHello:function(){
            }
        }

5.绑定事件函数

btn.onclick = function() {}// 点击了按钮就可以调用这个函数

6.定时器函数

setInterval(function() {}, 1000);  这个函数是定时器自动1秒钟调用一次

7.立即执行函数

(function() {函数体 })();//立即执行

8.构造函数

 function Star() {};
 new Star();
  • Function 里面参数都必须是字符串格式
  • 所有函数都是 Function 的实例(对象)
  • 函数也属于对象

1.2 函数的调用

  1. 普通函数
  2. 对象的方法(函数.方法)
  3. 构造函数
  4. 绑定事件函数(操作之后调用)
  5. 定时器函数(过多少秒自动调用一次)
  6. 立即执行函数(自动调用)

2. this

2.1 函数内 this 的指向

在这里插入图片描述

2.2 改变函数内部 this 指向

  1. call 方法
fun.call(thisArg, arg1, arg2, ...) // this指向,参数,参数
  1. apply 方法,(伪)数组
fun.apply(thisArg, [argsArray])//this指向,数组(传递的值)
  1. bind 方法,不会调用函数
fun.bind(thisArg, arg1, arg2, ...)//返回由指定的 this 值和初始化参数改造的原函数拷贝

区别点:

  1. call 和 apply 会调用函数, 并且改变函数内部this指向.
  2. call 和 apply 传递的参数不一样, call 传递参数 aru1, aru2…形式 apply 必须数组形式[arg]
  3. bind 不会调用函数, 可以改变函数内部this指向.

主要应用场景:

  1. call 经常做继承.
  2. apply 经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
  3. bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向

3. 严格模式

3.1 什么是严格模式

消除了 Javascript 语法的一些不合理、不安全之处,提高编译器效率,增加运行速度,保证代码运行的安全,禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,比如一些保留字不能作为变量名

3.2 开启严格模式

  1. 为脚本开启严格模式
<script>
 (function (){
 "use strict";
 function fn() {}
 })();
</script>
  1. 为函数开启严格模式( "use strict"声明放在函数体所有语句之前)
    function fn(){
    “use strict”;
    return “这是严格模式。”;
    }

3.3 严格模式中的变化

  1. 变量规定
    ① 严格模式下变量都必须先用var 命令声明,然后再使用。
    ② 严禁删除已经声明变量。例如,delete x; 语法是错误的。

  2. 严格模式下 this 指向问题
    严格模式下全局作用域中函数中的 this 是 undefined,不在指向window。
    ② 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错
    ③ new 实例化的构造函数指向创建的对象实例
    ④ 定时器 this 还是指向 window
    ⑤ 事件、对象还是指向调用者。

  3. 函数变化
    ① 函数不能有重名的参数。
    ② 函数必须声明在顶层,不允许在非函数的代码块内声明函数。

4. 高阶函数

高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出。

5. 闭包

5.1 变量作用域

变量根据作用域的不同分为两种:全局变量和局部变量。

  1. 函数内部可以使用全局变量。
  2. 函数外部不可以使用局部变量。
  3. 当函数执行完毕,本作用域内的局部变量会销毁

5.2 什么是闭包和作用

闭包(closure)指有权访问另一个函数作用域中变量的函数
简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。

<script>
function fn() {
   var num = 10;
    function fun() {
        console.log(num);
     }
     fun();
}
fn();

闭包作用:延伸变量的作用范围

5.3 在 chrome 中调试闭包

打开浏览器,打断点,找到 Scope 选项(global 全局作用域、local 局部作用域)

6. 递归

6.1 什么是递归?

函数内部自己调用自己, 这个函数就是递归函数,递归函数的作用和循环效果一样
由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件 return

用递归函数求斐波那契数列(兔子序列) 1、1、2、3、5、8、13、21…

function fb(n) {
            if (n === 1 || n === 2) {
                return 1;
            }
            return fb(n - 1) + fb(n - 2);
        }

7.拷贝

7.1浅拷贝

浅拷贝只是拷贝一层

 var obj = {
     id: 1,
     name: 'andy',
     msg: {
        age: 18
     }
};
var o = {}; 
Object.assign(o, obj);

7.2深拷贝

深拷贝拷贝多层, 每一级别的数据都会拷贝.

var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            },
            color: ['pink', 'red']
        };
        var o = {};
        // 封装函数 
        function deepCopy(newobj, oldobj) {
            for (var k in oldobj) {
                // 判断我们的属性值属于那种数据类型
                // 1. 获取属性值  oldobj[k]
                var item = oldobj[k];
                // 2. 判断这个值是否是数组
                if (item instanceof Array) {
                    newobj[k] = [];
                    deepCopy(newobj[k], item)
                } else if (item instanceof Object) {
                    // 3. 判断这个值是否是对象
                    newobj[k] = {};
                    deepCopy(newobj[k], item)
                } else {
                    // 4. 属于简单数据类型
                    newobj[k] = item;
                }

            }
        }
        deepCopy(o, obj);
        console.log(o)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值