目录
一、js数据类型
基本数据类型:
1、Null 空引用数据类型
2、Undefined 未定义类型
3、Number 数字类型
4、String 字符串类型
5、Boolean 布尔类型
引用数据类型:在JS中除了以上基本数据类型,其他所有类型都可以归结为引用数据类型。
Object 、Arrary 、Function 、Date 、Math......
二、作用域
作用域:指一个变量的作用范围
1、全局作用域
它是定义在函数、{ }外部的全局变量,全局作用域声明的变量和函数作为全局,它可以在页面的任意位置被访问到,作用范围是全局,作为window对象的属性和方法保存。
2、函数作用域
定义在函数内部的变量,作用范围是函数内,当调用函数时,函数作用域被创建。在函数作用域中可以访问到全局作用域的变量,在函数外无法访问到函数作用域内的变量。
三、闭包是什么
闭包就是函数内部嵌套函数,能够读取到其他函数内部变量的函数。作用域链得不到释放,造成消耗内存。
在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,那么我们想在一个函数内部也有权限访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数。
优点:
①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)。
③匿名自执行函数可以减少内存消耗。(function(){ }){ }
缺点:
①被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
解决方法:立即执行函数
声明后立即执行(创建函数后就立即执行),执行后销毁
IIFE
- 页面加载完成后只执行一次的设置函数。
- 将设置函数中的变量包裹在局部作用域中,不会泄露成全局变量。
四、this
谁调用指向谁
1、单独使用this,指全局
在浏览器中,是window对象
在node,是global对象
2、函数中使用this
在函数中,函数的所属者默认绑定到 this 上
3、事件中的 this
在 HTML 事件句柄中,this 指向了接收事件的 HTML 元素
五、call()、apply()、bind()
可以通俗的理解为改变this的指向。
.call(执行环境对象,实参列表);
.apply(执行环境对象,实参列表数组);
.bind(执行环境对象)(实参列表);
参考:JavaScript 中 call()、apply()、bind() 的用法 | 菜鸟教程
六、原型和原型链
js中有两种原型,一个是显式原型prototype,另一个是隐式原型_proto_。
显式原型(prototype):当一个函数被创建之后,都会有一个prototype的属性,这个属性指向函数的原型对象,而这个原型对象有一个constructor的指针,保存着构造函数的地址,指回该构造函数。
隐式原型(_proto_):当用构造函数实例化(new)一个对象时,就会产生一个_proto_的属性,_proto_实际上是一个指针,指向创建该对象的函数的原型prototype,当需要使用某些属性或方法时,先在自身找该属性或方法,如果找不到,就会通过_proto_逐层向上寻找,由此形成原型链。
结合下图理解: