读 你不知道的javascript 笔记(一)

1、js的编译原理

首先,js是一门编译型语言(动态、解释执行),可以简单理解为,运行时才编译,当然速度很快。

作为语言,编译时会经历几个阶段:
1、分词/词法分析
2、解析/语法分析
3、代码生成

var a = 2
对于一个 var a = 2
编译阶段所做的事情就是
1、将 var a = 2 分解成一些词法单元 var、a、=2 
2、将上述转化为AST(抽象语法树)
3、将 AST 转化为代码执行(分配内存 ,创建变量a ,储存a值)

2、编译过程中该怎么做?做些什么?------作用域

上面我们知道了,代码会经历三个阶段,那这三个阶段应该怎么做呢?或者说需要怎么去配合,这就引出了 作用域的概念-----其实就是变量查找的规则
在编译过程中需要 三个兄弟共同完成
1、引擎-------负责整个编译和执行过程
2、编译器------负责词法分析、代码生成
3、作用域------收集和维护变量标识符,制定查找规则(其实内含了变量提升)

3、结合编译过程,理解作用域

三个编译过程的协调合作,实现了代码生成,在过程中,引入两个概念,LHS(左查询)RHS(右查询)

在对 var a = 2 引擎进行编译时,先进行 左查询,查找变量a ------>作用域
然后进行赋值操作 a = 2
LHS----变量赋值
RHS----得到xxx的值
在对代码进行编译时,词法分析中会进行 LHSRHS,进而查找变量、变量的赋值
变量的查找就先在当前的词法作用域中找,如果没有就继续往上,一直到达建筑顶层
这就是作用域链(继续深入就会发现一些伪装的作用域)

对于 b = 2

这是赋值操作,会进行 LHS,和 RHS不同,当这个变量b 不存在时,会自动创建一个,这就是 js中,未声明变量,结果会变成全局变量的原因(非严格模式下)

对于 console.log(c)
属于获取 c 的值 ,进行 RHS,然而作用域中找不到变量c的值,所以报错ReferenceError

4、欺骗词法作用域

eval、with,用的少,作为了解吧,我的印象中好像看见过with

var obj = {
	a: 1,
	b: 2,
	c: 3
};
with (obj) {
	a = 3;
	b = 4;
	c = 5;
}
人话就是 让你 取对象的值时,少.XXXwith实际是引入了一个新的词法作用域

5、词法作用域

js 的作用域是 词法作用域 非动态作用域

function foo() {
          var a = 2
          bar()
      }
function bar(){
    console.log(a)
}
var a = 3
foo() // 3

动态作用域,在运行时创建的作用域,有点类似this
如果说,js是动态作用域,那么 输出 a 应该等于 2,因为作bar()处在嵌套的函数内调用的,但是 js是词法作用域,在写代码或者定义的时候就确定了

6、关于this

6.1 this的出现,是为了,反复传递context对象而出现
6.2 this的绑定出现在运行时,而不是编写代码时
6.3 四条规则,判断this的绑定对象

1new调用?绑定到新对象
2、call、apply、bind、?绑定到指定对象
3、上下文对象中调用?(obj.fn())绑定到上下文对象
4、默认 全局 window

es6中,箭头函数并不遵循这四条规则,会继承外层函数的this

7、typeof null 为什么是object

null在js中是空对象的引用,原理是这样的,js不同对象在底层都是二进制,而二进制中前三位为0----->判断为object,而null的二进制全为0,因此返回object

8、有点混淆了 ++a和a++

自增或自减,单独使用是一样的,参与运算或赋值时不一样
++a ,先增加,在计算
a++,先计算,在增加

var a = 1
a++ // 2
++a //2
--------------------------------------------------
var b = a ++
console.log(a,b)//2,1
var b = ++a
console.log(a,b)//2,2
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值