js 是一种前端语言,他的特点是效率高,十分的简单,但也有不好的一些地方,就如你不知道的js 其实讲的是这本书好的东西和坏的东西
1.编译原理 在大多数的编译语言中,程序中的一端源代码在执行之前经历三个步骤,预处理汇编,编译,但在js中更复杂,
-
分词/词法分析 这个过程会将字符串进行切割让其变成一个有意义的代码块(词法单元)var a = 2; 会被切割为 var、a、=、2、;。(这个。不是被代码)在这里空格被不被切割看其是否具有含义。 分词和词法分析的区别是有无状态。有状态的是词法分析,无状态的是分词。 这里详细说说无状态函数
无状态函数
-
定义:无状态函数是指那些不保存任何内部状态的函数。这意味着每次调用该函数时,它都会根据传入的参数产生相同的输出,而不会受到之前调用的影响。 function add(a,b){ return a+b; } 简单来说就是里面的参数最后所得的值是由输入的值决定和内部无关,他只给你函数法则!
无状态组件 (React)
在React框架中,无状态组件也被称为“纯组件”或者现在更常被称为“函数组件”。这些组件接收props作为输入,并基于这些props渲染UI,但它们自身不维护任何内部状态(即不使用this.state
)。
-
定义:无状态组件是只接受输入属性(props)作为参数,并返回React元素的简单函数。 -const Greeting = (props) =>
Hello, {props.name}!
; -
解析或者语法分析 这个过程叫做词法单元流转换成一个由元素逐级嵌套所组成的代表程序语法结构的树。即抽象语法树(Abstract Syntax Tree,AST). var a = 3,
将AST转化为可执行代码的过程称为代码生成。AST转化为一组机器人的指令,用来创建a这个变量,并将一个值存在a中。
- js引擎处理时间短所以性能很好。 1.2 理解作用域 接下来是一个例子 var a = 2; 这是两个声明一个由编译器在编译时处理一个由引擎处理。 编译器将其分解成词法单元后将此法单元解析成一个树状解构,
引擎会询问当前作用域是否有这个变量a没有则去上一层作用域查找。
1.2.3
LHS和RHS的区别
在JavaScript中,LHS和RHS是两个术语,它们来源于编译原理中的概念,分别代表“Left-Hand Side”(左侧)和“Right-Hand Side”(右侧)。这两个术语通常用于描述变量查找过程中的不同行为。
-
LHS (Left-Hand Side):当一个表达式中涉及到给某个变量赋值时,出现在赋值操作符左边的就是LHS。例如,在
x = 5;
这个语句中,x
就是LHS。LHS查找的主要目的是找到变量的容器本身,即内存空间,以便将数据存储进去。如果在当前作用域找不到该变量,引擎会尝试在上级作用域中继续寻找,直到全局作用域。如果仍然没有找到,并且不是严格模式下,则会在全局作用域创建这个变量;如果是严格模式('use strict';
),则会抛出一个引用错误(ReferenceError)。 -
RHS (Right-Hand Side):相对地,RHS指的是获取变量的值。在上面的例子
x = 5;
中,数字5
可以被视为RHS,但实际上更常见的是当我们使用变量时的情况,如console.log(x);
这里的x
就处于RHS的位置。RHS查找的目标是取得变量里存储的数据。如果尝试访问一个未定义的变量(即在任何作用域内都找不到),JavaScript同样会抛出一个引用错误(ReferenceError)。
总结来说,LHS和RHS主要区别在于处理变量的方式:LHS关注于变量的位置(在哪里存储数据),而RHS关注于从变量中读取实际的数据内容。理解这两者之间的差异对于掌握JavaScript的作用域链、闭包等高级概念非常重要 。 1.3 作用域的嵌套 简单说我们在查询变量时会从当前作用域进行查找,当前作用域没有则去外层进行查找 1.4 当我们没有查找到·这个变量时就会出现Reference Error这个错误提示或者是TypeError 前者是同作用域判别失败,后者是作用域判别成功但是对结果操作是不合理的。