执行上下文环境
“准备工作”中完成了那些工作
1、变量:变量的声明,默认赋值为undefined
2、this:赋值
3、函数声明:赋值
这三种数据的准备情况下我们称之为“执行上下文”或者“执行上下文环境”
函数中的变量:
1、函数每被调用一次,都会产生一个新的执行上下文环境,因为不同的调用可能就会有不同的参数。
2、函数的定义的时候 , 就已经确定了函数体内部变量的作用域
执行上下文栈
执行全局代码时 , 会产生一个全局上下文环境 , 每次调用函数时又会产生一个函数上下文环境 , 当函数调用完成时 , 这个函数上下文环境以及其中的数据都会被销毁 , 在重新回到全局上下文环境 . 处于活动状态的执行上下文环境只有一个 . 实际上 , 就是一个压栈和出栈的过程
作用域和执行上下文
除了全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了。而不是在函数调用时确定。
作用域只是一个 ” 地盘 ”, 一个抽象的概念 , 其中没有变量 . 要通过作用域对应的执行上下文环境来获取变量的值 . 在同一个作用域下 , 不同的调用会产生不同的执行上下文环境 , 继而产生不同的变量的值
作用域链
1. 先在当前作用域查找 x, 如果有则获取并结束 , 如果没有则继续 ;
2. 如果当前作用域是全局作用域,则证明 x 未定义,结束;否则继续;
3. (不是全局作用域,那就是函数作用域)将创建该函数的作用域作为当前作用域;
4. 跳转到第一步
**this的用法**
在函数中,当函数真正被调用执行的时候确定的,函数定义的时候确定不了,因为this的取值是执行上下文环境的一部分,每次调用函数都会产生一个新的执行上下文环境。
1.构建函数之this
如果函数作为构造函数使用,那么this就代表它new出来的对象
如果函数作为普通函数调用,这种情况this是值window,
2.函数作为对象的一个属性
如果函数作为对象的一个属性时,并且作为对象的一个属性被调用时,函数中得this指向该对象。
3.函数用call或apply调用
当一个函数被call和apply调用时,this的值就去传入的对象的值
4。全局&普通函数的调用
普通函数调用时,其中this指向window对象
5.构造函数prototype
this代表的是当前对象的值,不仅仅是再构造函数的prototype,即便是是在整个原型链中。
html5本地储存
cookie,各种浏览器都支持,直接用js就可以调用,缺点储存空间小,每个站定大小限制在4KB左右,又有有限期限,是明文传递,所有安全性成问题
1. cookie 数据始终在同源的 http 请求中携带(即使不需要),即 cookie 在浏览器和服务器间来回传递。而 sessionStorage 和 localStorage 不会自动把数据发给服务器,仅在本地保存。
2. 存储大小限制也不同, cookie 数据不能超过 4k ,同时因为每次 http 请求都会携带 cookie ,所以 cookie 只适合保存很小的数据,如会话标识。sessionStorage 和 localStorage 虽然也有存储大小的限制,但比 cookie 大得多,可以达到 5M 或更大。
3. 数据有效期不同, sessionStorage :仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持; localStorage :始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;如果不设置该属性,或者设为 null , Cookie 只在当前会话( session )有效,浏览器窗口一旦关闭,当前 Session 结束,该 Cookie 就会被删除。
localStorage,sessionStorage 的区别 :
1. localStorage: 没有时间限制的本地存储 , 也就是说 ,localStorage 永远不会过期 , 除非主动删除数据 . 数据可跨越多个窗口 , 无视当前会话 , 在同一个域中被共享使用 .
2. sessionStorage: 针对 session 的数据存储 , 任何一个页面存储的信息在窗口中同一域下的页面都可以访问它存储的数据 . 每个窗口的值都是独立的 , 它的数据会随着窗口的关闭而消失 , 不同窗口间的 sessionStorage 是不能被共享的