作用域
执行环境中变量或函数的作用范围,作用域定义了变量或者函数有权访问的其他数据
全局作用域
1.全局作用域在页面打开时被创建,页面关闭时被销毁
2.在script标签中的变量和函数,作为全局作用域,在页面的任意位置可以被访问到
3.全局作用域可以认为是Window
局部(函数)作用域
1.函数调用时,函数作用域被创建,函数执行完毕,函数作用域被销毁
2.每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的
3.函数作用域可以访问上层作用域,但是相邻函数作用域是相互独立的
ES6中的块级作用域
通过let或者const声明会形成块级作用域,与其他作用域一样,对外是不可见的
作用域链
预编译
全局预编译
1.全局上下文创建后,会生成变量对象GO
2.GO首先寻找变量声明,然后寻找函数声明,属性值为函数本身
3.如果函数名与变量名冲突,函数声明会将变量声明覆盖
函数预编译
函数上下文创建后,会生成变量对象AO
1.寻找变量声明,变量名作为AO对象的属性名,属性值为undefined
2.寻找形参,形参名作为AO的属性名,属性值为undefined
3.将实参的值赋予给形参,即替换AO对象中形参的属性值
4.寻找函数声明,函数名作为AO对象的属性名,属性值为函数本身
5.如果函数名与变量名冲突,函数声明会将变量声明覆盖
JS数据类型
基本数据类型:
string number boolean null undefined symbol bigint
引用数据类型:
object(Array Object Function Map Set)
深拷贝与浅拷贝
浅拷贝:
浅拷贝只会拷贝引用数据数据类型的地址,当某个数据被修改后,也会影响到另一个拷贝的数据
深拷贝:
深拷贝会拷贝多层,对于每一级的数据都会拷贝
深拷贝实现:
1.Object.assign()和扩展运算符只有一级属性为深拷贝,二级属性后就是浅拷贝
2.JSON.parse(JSON.stringify())
先用JSON.parse把对象转换成JSON字符串,然后用JSON.stringify把JSON字符串转换成对象
3.通过递归方式实现
4.jQuery的extend方法实现深拷贝
5.函数库lodash
var _ = require('lodash')
var obj2 = _.cloneDeep(obj1)
闭包
定义:闭包就是能够访问到其他作用域中变量的函数,闭包是作用域链中的一种现象
作用:延伸了变量的作用范围
缺点:内存泄漏
this
①全局作用域和普通函数调用,此时 this 指向 window
②方法调用中谁调用this指向谁
③通过事件绑定的方法,此时this指向绑定事件的对像
④定时器函数this指向window
⑤箭头函数中没有this或者说他的this指向上一层的作用域
⑥Call和apply和bind可以动态改变this指向,bind不会立即调用函数会返回一个函数要调用才能执行
EventLoop(事件循环)
定义:在代码执行过程中,碰到异步任务会添加到任务队列中,等主线程执行完毕后执行异步任务
异步任务分为宏任务和微任务,微任务优先级大于宏任务
执行顺序先同步后异步
异步任务:
宏任务:setTimeout setInterval ajax DOM事件
微任务:Promise
微任务执行优先级 > 宏任务
同源策略
定义:同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。
源就是协议、域名和端口号。
跨源网络访问
1.跨域写操作,一般被允许。如:链接(links),重定向以及表单提交
2.跨域资源嵌入,一般被允许
对于第一第二点1,2没有跨域问题
3.跨域读操作,一般不被允许,但可以通过内嵌资源来进行读取访问
img文件中的文件资源受不受同源策略影响?
图片资源受到同源策略影响,但是属于跨域资源嵌入的方式,所以没有跨域问题
跨域的处理方式
1.JSONP
原理:动态创建script标签,src属性指向没有跨域限制
src指向一个接口,接口返回格式一定是***()函数表达式,使用时函数名要与后端返回的一致
缺点:只能get请求,不能返回后端状态码,
2.CORS
1.简单请求
2.非简单请求
原型
构造函数时,会创建一个对应的原型对象。构造函数默认有一个prototype属性,prototype的值指向函数的原型。同时原型中也有一个constructor属性,constructor的值指向函数对象。 通过构造函数实例化出来的对象,默认有一个proto属性,proto的值指向构造函数的原型。
原型链
当在实例化的对象中访问一个属性时,首先会在该对象内部寻找,如找不到,则会向其proto指向的原型对象中寻找,如仍找不到,则继续向原型中proto指向的上级原型对象中寻找,直至找到或原型链尽头,值为null,这种链状过程即为原型链