JS高级笔记(3)函数进阶

函数的定义

函数的定义方式

1.函数声明方式function关键字(命名函数)
function fn() {}
2.函数表达式(匿名函数)
var fun =function() {}
3.new Function(‘参数1’,‘参数2’,…,‘函数体’)
var f= new Function(‘a’,‘b’,‘console.log(a+b)’);
f(1,2);
Function里面参数都必须是字符串格式
第三种方式执行效率低,也不方便书写,因此比较少使用
所有函数都是Function的实例(对象)
函数也属于对象

在这里插入图片描述

函数的调用方式

1.普通函数
function fu(){
console.log(“a”)
}
fn(); fn.call();
2.对象的方法
var o={
sayHi:function(){
console.log(“a”)
}
}
o.sayHi();
3.构造函数
function Star(){}
new Star();
4.绑定事件函数
btn.οnclick=function() {}
5.定时器函数
setInterval(function() {},1000)
6.立即执行函数
(function(){
console.log(“a”);
})

this

函数的不同调用决定了this的指向不同
1.普通函数this指向window
2.对象的方法this指向的是对象o
3.构造函数this指向ldh这个实例对象 原型对象里面的this指向的也是ldh这个实例对象
4.绑定事件函数this指向的是函数的调用者btn这个按钮对象
5.定时函数this指向的也是window
6.立即执行函数指向的也是window
在这里插入图片描述

改变函数内部this指向:call() apply() bind()

call 方法
call()方法调用一个对象。简单理解为调用函数的方法,但是他可以改变函数的this指向
fn.call(thisArg,arg1,arg2…)
call的第一个可以调用函数 第二个可以改变函数内部this指向、
call的主要作用可以实现继承
apply方法
apply()方法调用一个函数。简单理解为调用函数的方式,但是他可以改变函数的this指向
fn.apply(thisArg,[argsArray])
thisArg:在fn函数运行时指定的this值
argsArray:传递的值,必须包含在数组里面
返回值就是函数的返回值,因为它就是调用函数
apply的第一个可以调用函数,第二个可以改变函数内部this指向
apply的主要应用:比如说我们可以利用apply借助于数学内置对象求最大值
var arr=[1,66,3,9];
var max=Math.max.apply(null,arr);
console.log(max)
band方法
band()方法不会调用函数,但是能改变函数内部this指向
fn.bind(thisArg,arg1,arg2,…)
thisArg:在fn函数运行时指向的this值
arg1,arg2:传递的其他参数
返回由指定的this值和初始化参数改造的原函数拷贝
返回的是原函数改变this之后产生的新函数
应用场景:比如改变定时器内部的this指向

严格模式

严格模式在ie10以上版本的浏览器才会被支持,旧版本浏览器中会被忽略
严格模式对正常的js语义做了一些更改:
1.消除了js语法的一些不合理,不严谨之处,减少了一些怪异行为。
2.消除代码运行的一些不安全之处,保证代码运行的安全。
3.提高编译器效率,增加运行速度。
4.禁用了在ECMAScript的未来版本中可能会定义的一些语法,为未来新版本的js做好铺垫,比如一些保留字如:class,enum,export,extends,import,super不能做变量名

开启严格模式

严格模式可以应用到整个脚本或个别函数中,因此在使用时,我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况
1.为脚本开启严格模式
为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 “use strict” (或’use strict’)。
2.为函数开启严格模式
要给某个函数开启严格模式,需要把 “use strict” (或’use strict’)生命凡在函数体所有语句之前

严格模式中的变化

1.变量规定
(1).在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用var命令声明,然后再使用
(2).严禁删除已经声明的变量 ,例如delete x语法是错误的
2.严格模式下this指向问题
(1).以前再全局作用域函数中的this指向window对象
(2).严格模式下全局作用域中的this是undefined
(3).以前构造函数时不加new也可以调用,当普通函数,this指向全局对象
(4).严格模式下,如果构造函数不加new调用,this会报错
(5).new实例化的构造函数指向创建的对象实例
3.函数变化
(1).函数不能有重名函数
(2).函数必须声明再顶层。新版本的js会引入块级作用域。为了与新版本接轨,不允许再非函数的代码块内声明函数

高阶函数

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

闭包
变量作用域

变量根据作用域的不同分为两种:全局变量和局部变量
1.函数内部可以使用全局变量
2.函数外部不可以使用局部变量
3.当函数执行完毕,本作用域内的局部变量会销毁

什么是闭包

闭包指有权访问另一个函数作用域中变量的函数,
简单理解就是,一个作用域可以访问另一个函数内部的局部变量
闭包的主要作用:延伸了变量的作用范围

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

闭包案例:1.循环注册点击事件 2.循环中的setTimeout() 3.计算打车价格

递归
什么是递归

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
简单理解:函数内部自己调用自己,这个函数就是递归函数
递归里面必须加退出条件

浅拷贝和深拷贝

1.浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用
2.深拷贝拷贝多层,每一级别的数据都会拷贝
3.object.assign(target,…sources) es6新增方法可以浅拷贝
深拷贝

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],ite,)
          }else if(item instanceof Object){
                //3.判断这个值是否是对象
                newobj[k] ={};
                deepCopy(newobj[k],item)         
           }else{
                  //4.属于简单数据类型
                      newobj[k] =item;
            }
      }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VIVI Xiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值