码迷,mamicode.com
首页 > Web开发 > 详细

JS简记

时间:2018-04-30 00:01:13      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:提前   通过   引擎   顺序   code   声明   use   查找   说明   

var a = 1;
console.log(a);

第一行代码var a=1,会被引擎看成两句话:var a和a=1。

首先,会由编译器询问当前作用域内(这里就是全局作用域)是否存在已经声明的变量a,如果存在则忽略var a,否则在当前作用域内声明变量a(这时,作用域内就有了变量a。测试时可以发现,即便两行代码倒置顺序,并不会抛ReferenceError,而是打印undefined,说明引擎首先会提前通过编译器执行代码中所有的声明操作)。

其次,编译器声明变量a(即在作用域内生成了变量a)后,就会编译a=1语句,编译后的语句由执行引擎执行。

最后,在执行引擎执行时,也就是在执行被编译后的a=1时,首先会进行LHS(左查找,目的是找到变量所在的容器,顺着作用域链查找,如果最终在全局作用域中仍未找到,则会默认在全局作用域内声明该变量,但如果是“use strict”,则与RHS未找到一样,抛ReferenceError),然后在赋值1。

var o = {};
o.b = 1;
console.log(o.b);

引擎在执行o.b=1时(假设已被编译器编译),首先会LHS查找变量o,然后使用对象访问规则访问o的b属性,这里就是对b赋值1。

JS简记

标签:提前   通过   引擎   顺序   code   声明   use   查找   说明   

原文地址:https://www.cnblogs.com/holoyong/p/8972312.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!