JavaScript函数
- 传统语言的函数编译好之后,成为一个代码块
- JS里面,函数被认为是一块可以反复调用的代码块
- eval函数对应javaScript引擎底层的命令,可以将字符串当作语句在任意地方执行
JS里面把函数作为第一等公民,函数可以拥有他自己的属性和方法,就如同对象一般
- 赋值给变量
- 赋值为对象的属性
- 作为参数传递给其他函数
- 作为函数的结果返回
- 给函数配置方法和属性
函数的本质是Function函数创建的对象
- Function的原型就是Function的胚胎属性
- toString方法,获取函数的实现源代码的字符串
- 改变对象方法中this指针的三剑客
- 注释:JS里面的方法可以修改关联的对象,就是下面的三种方式,
- call方法:Function.call()
- apply方法:
- bind方法:
- 以上三个方法具体见ppt,call和apply都会立即执行,二者只是参数写法不同
- bind和其他两个不同的是返回值是一个函数,并且需要调用一下
函数定义
var add = new Function(
'x',
'y',
'return x+y;'
)
函数可以在定义的时候可以不加名称,作为匿名函数,成为即使函数(有点像java匿名内部类的性质)
函数的调用
function Hello(){
return 1;
}
console.log(Hello)
console.log(Hello())
函数的参数
function max(){
var max = Number.NEGATIVE_INFINITY
}
剩余参数
剩余参数通过结构赋值剩余项来处理参数
函数的参数默认值
function Point(x=0,y=0){
this.x = x ;
this.y = y ;
}
函数的使用
- 函数赋值给变量。函数的this是全局对象global
- 函数作为参数,比如 加减乘除
柯里化:将多参数函数转化为但参数函数,本质上是逐步传递,逐步缩小函数的适用范围,逐步求解,降低通用性,提高适用性。
函数数组
就是把函数的声明和定义放在一个大的数组对象里面,有大括号包起来,然后【】运算访问就行
自定义函数属性
函数也是对象,可以随时添加属性,函数需要一个静态变量时,最好的方式就是定义一个函数的属性,而不是全局变量。
function person(){
this.name = 'Tom';
}
function person(){}
person.name = 'Tom';(3)
function person(){}
person.prototype.name = 'Tom'
1是公有属性 2是静态属性 3是原型共享属性
高阶函数
就是操作函数的函数,接受多个函数作为参数,并且返回一个新的函数
传统编译语言进程空间
-
代码区: -
全局数据区: -
堆区: 动态内存,提供程序随机申请 -
栈区:函数数据区
JavaScript代码运行机制
- js代码是一文本形式加入js引擎执行
- js代码文本类型
- 全局代码:不包括函数体、Generator定义体和类定义的代码
- 函数代码:函数体、Generator定义体和类定义体的代码
- Eval代码:
- 模块代码:
- 不同类型的上下文:看ppt,没记下来
- 执行上下文(execution context):简称EC,代码执行时的变量环境,全局代码在全局EC中执行
- 执行上下文可以认为是一个对象:三个属性
- 变量对象VO:
- 作用域链SC:
- this:有激活EC的调用者来提供,
闭包
this
- this是EC的一个属性
- 全局代码中,this始终是全局对象
- 在函数代码中,this在函数执行过程中不能被修改
- 函数一构造函数方(new新建函数对象)式调用的话,this指向新创建出来的对象。
- 函数可以在调用的时候指定this值,可以用call等三剑客修改this(函数执行时不可以修改)
- 主要使用call和apply进行修改,因为这两个是定义在Function.prototype上的
递归函数
- JS也有递归函数
- 直接递归:调用自身
- 简介递归:多个函数循环调用对方形成调用链,进行递归
- 递归本质:每次递归都会在EC stack上加一个EC,
- 尽可能不使用递归,影响函数运行效率
console.time("记时开始")
console.timeEnd("记时结束")
算法对函数效率的影响
对象的构造
语法糖,写出来和C++ java差不多
对象的继承
使用构造函数对原型进行深拷贝,避免引用复制的浅拷贝。
继承的步骤
- 属性的构造
- 方法的构造
- 注释:ES6 的class语法糖,非常接近java和C++,JS根本没有类的概念,本质还是前两个
- extend关键字:表示继承
- super关键字:表示父类
严格模式
- js的第二个运行模式
- 为什么设立严格模式:严格语法,减少怪异,会增加更多的报错,提高编译效率和安全性
- 严格标志:use strict 加在代码前面
严格模式的主要限制
|