1、函数的多种定义和调用方式
函数的定义方式:
1.函数的恒明方式function关键字(命名函数)
2.函数表达式(匿名函数)
3.new Function()
var fn = new Function(‘参数1’,‘参数2’,‘函数体’)
function里面参数都必须是字符串格式
第三种方式执行效率低,也不方便书写,很少使用
所有函数都输function的实例(对象)
函数也属于对象
函数的调用方式
1.普通函数
function fn(){console.log(11)}
fn() fn.call() 普通函数调用的两种方法
2.对象的方法
var a = { aa:function(){console.log(11)} }
a.aa(); 对象点方法调用里面的函数
3.构造函数
function Aa(){}
new A阿(); 构造方法调用 new一个实例对象
4.绑定事件函数
btn.onclick = function(){} //点击了按钮就可以调用这个函数
5.定时器函数
setInterval(function(){},1000)
//这个函数是定时器 每隔1秒调用一次
6.立即执行函数
(function(){console.log(11)})()
//立即执行函数是自动调用
2、改变函数内部this的指向
改变函数内部this指向的三种方法
1.call()//可以调用函数 也可以改变函数this的指向 主要作用实现继承
2.apply()//可以调用函数 也可以改变函数this的指向
fun,apply(thisArg,[argsArray])
thisArg:在fun函数运行时指定的this值
argsArray: 传递的值,必须包含在数组里面
返回值就是函数的返回值,因为它就是调用函数
3.bind()不会调用函数。但是能改变函数内部this指向
fun,bind(thisArg,ary1, ary2)
thisArg:在fun函数运行时指定的this值
ary1, ary2: 传递的其他参数
返回由指定this值和初始化参数改造的原函数拷贝
call apply bind 总结
相同点:
都可以改变函数内部的this指向
区别点:
1.call和apply 会调用函数,并且改变函数内部this指向
2.call和apply传递的参数不一样,call传递参aru1 ,aru2形式apply必须是数组形式[ary]
3.bind不会调用函数,可以改变函数内部this指向
主要应用场景:
1.call经常做继承
2.apply经常跟数组有关系。比如借助于数学对象实现数组最大值最小值
3.bind 不调用函数,但是还想改变this、执行,比如改变定时器内部的this指向
3、严格模式的特点
1.消除了javascript语法的一些不合理、不严谨之处,减少了一些怪异行为。
2.消除代码运行的一些不安全之处,保证代码运行的安全
3.提高编译器效率,增加运行速度。
4.禁用了在ECMAScript的未来版本中可能会定义的一些语法,为未来新版本的javascript做好铺垫。
开启严格模式
严格模式可以应用到整个脚本或个别函数中。我们可以将严格模式分为 为脚本开始严格模式和为函数开启严格模式两种情况。
‘use strict’
严格模式中的变化
1.变量规则
1.1 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种方法,变量都必须先var声明 然后使用
1.2严禁删除已经声明变量。 例如 delete x ; 语法错误的
2.严格模式下this指向问题
2.1严格模式下全局作用域中函数中的this是 undefined
2.2严格模式下,如果构造函数不加new调用,this会报错
2.3new 实例化的构造函数指向创建的对象实例
2.4定时器this还是指向widow
2.5事件、对象还是指向调用者
3.函数变化
3.1函数不能有重名的参数
3.2函数必须声明在顶层(ES6中)引用块级作用域。 为了与新版本接轨不逊于在非函数的代码块内声明函数。
4、高级函数
高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出
5、闭包
闭包指有权访问另一个函数作用域中变量的函数
闭包的主要作用:延伸了变量的作用范围
6、递归的两个条件
递归函数: 函数内部自己调用自己,这个函数就是递归函数
递归函数的作用和循环效果一样
递归必须加退出条件
7、深拷贝和浅拷贝的区别
浅拷贝:
1、浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用
2、深拷贝拷贝多层,每一级别的数据都会拷贝
Object.assign(target, ...sources)
target: 目标对象。
sources: 源对象。
如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。