概念
(1)浏览器组成
1.shell :用户所有能看到和操作的浏览器部分称为shell部分。
2.内核
1.渲染引擎
2.js引擎(其它引擎)
js代码 > c代码 > 汇编代码 > 机器码
3.V8引擎:把js代码直接转换成机械码来执行,进而以速度快而闻名。
(2)编译和解释性语言
解释性语言:把一行代码翻译成机器码后就执行一行代码。
js中实现多任务的原理(单线程)
把同一个任务分解成多个轮转时间片 每个时间片可能执行不同任务的分解片,因为执行速度非常快 人看起来就像同一时间内在做多件事情。
栈内存和堆内存
栈内存分配内存的方式从底向上依次分配;
堆内存分配内存的方式是随机分配的成散列状态;
栈里面的值一旦被分配后是不可能被修改的;
js的错误不会影响到其它js代码块的执行 只能影响到当前js块代码的执行;
typeof()的返回值
类型有:number string boolean nudefined function
object的返回条件 Object,Array,null
NaN 是number类型
类型转换
隐式类型转换
a+=b 的含义是:先读取a的内容然后在a的基础上加上b的内容最后再赋值给a。
b=a++ +1; 在赋值语句中先运行b=a+1 然后再执行a++
b=++a +1; 在赋值语句中先运行a++ 然后再运行b=a+1
var a=b=100
先把100赋值给b;
然后把全局变量b赋值给局部变量a;
赋值一定是从右向左来依次执行的;
如果在函数中这样赋值的话a是局部变量 b是一个全局变量;
js执行步骤
语法分析:通篇扫描检查是否有语法错误;
预编译:用来解决函数代码执行顺序的问题;
通篇预编译:提取var function关键字;
函数预编译
预编译发生在函数执行的前一刻
创建函数执行的AO(活动)对象 就是一个对象数据字典
AO对象就是函数的执行作用域 也可以叫做执行期上下文
1).创建一个对应的AO对象;
2).先找形参和变量声明做为AO对象的key 所有的value为undefined;
3).给AO对象的值undefined找到相应实际值;
4).找函数中的函数声明 函数名称为key,value为对应的函数体字符串;
5).如果AO对象的key重复使用的话 后面步骤的赋值会覆盖前面的值;
6).函数执行的时候所有的变量的值都是从已经创建好的AO对象中取值,并不是按照编写代码的顺序来获取的。
全局预编译
生成一个GO对象 就是window对象;
没有参数传递步骤 其它和函数预编译一样;
变量和函数提升的方式:都是只提升一级,全局的变量和函数会提升到所有执行代码的最前面,嵌套函数和局部变量只会提升到父级函数代码的最前面 它还是在一个函数的内部。
解释执行 :读取一行代码执行一行代码
作用域解释scope:作用域属于一个函数 函数在定义和执行的时候产生的作用域是不一样的;函数执行前的一刻会生成一个自己的AO对象 这个对象会挂载到自己作用域的最顶端 而在定义的时候是没有这个AO对象的。每个函数都有一个不可访问(隐式属性)的[[scope]]属性 这个属性仅供js引擎来读取,[[scope]]属性里面存的是作用域链[[scope_chain]],查找变量的时候是从作用域的顶端依次向下查找。
立即执行函数:原理是表达式能执行:把函数变成表达式后就变成了立即执行函数,在函数前面添加一个+或者-号就是把函数声明变成函数表达式。+ function test(){}() test就可以被立即执行。只有函数表达式才能直接被调用符调用。
闭包
当内部函数被保存到外部时候,将会生成闭包.
闭包会导致原来的作用域链不释放,造成内存泄露
闭包外部函数调用完毕后并不能直接回收对应的AO对象所处的内存空间,而是销毁名称与AO对象之间的引用关系 因为内部函数还引用着AO内存。
分析函数的作用域链:就是分析函数如何找变量的过程
1).分析函数被定义时候的作用域链
全局GO(window) 可能还包含外部函数的AO。
2).分析函数执行时候的作用域链
实时产生一个自己的AO 把自己产生的AO对象挂载到作用域链的最顶端。

浙公网安备 33010602011771号