一、什么是JavaScript
- javascript 是运行在浏览器中的高级语言,因为计算机只能识别机器语言(即0110 0011)所以在浏览器中通过解释器将其翻译为机器语言。(以下简称js)
- javascript与java并没有什么关系,仅仅只是名字相像而已。
- js写在html文件中且用的<script>的标签中。
二、js的数据类型
js的数据类型大体上分为两大类
1.基本数据类型
- number 数字型 如:2,3,6,-4 …
- string 字符串型 必须写在" " 或 ’ ’ 内如:‘name’,‘123343’ …
- boolean 布尔型 只有两个值 true 和 false
- undefined 未定义
- null 空
2.引用数据类型
- Object
Arrary 数组
function 函数
…
三、js的基本语法
1.引入js的三种方式
1.行内引入
<button onclick="alert('hello world')">按钮</button>
2.内部引入
<script> alert('hello world'); </script>
3.外部引入
通过<script scr=‘外部js文件路径’><script src="./index.js"></script>
2.js的变量分类
1.全局变量
- 在函数外部声明的变量为全局变量,在整个代码块中都可以使用。
2.局部变量
- 在函数内部声明的变量为局部变量,一般情况下只在函数体的内部使用。(闭包除外)
3.变量的声明
在js中可以用var let const 声明变量,用const来声明常量
1.使用var声明的变量
var a = 1; var a = 2;结果不会报错,输出2
- 可以重复声明
- 在执行代码时需要提升
- 并且会挂在到(全局对象)GO中。
2.使用let声明的变量
- 不能重复声明
let a = 1; let a = 2; 结果报错
·- 不需要提升
- 不会挂在到GO中
- 与{}搭配可以形成块级作用域
function f(){let a = 1;} a 只作用于函数体中
3.使用const声明常量
- 不能重复声明(如上)
- 不需要提升
- 不会挂在到GO中
- 与{}搭配可以形成块级作用域(如上)
- 必须赋值
const a;结果报错
四、数据的存储与代码执行过程
1.简述数据存储
- 数据存储在内存和硬盘中,存储在内存中的数据断电后不能保存,存储在硬盘中的数据断电后可以保存。
- js代码在执行时会将基本数据类型存放在栈内存中,将引用数据类型存放在堆类型中。
- 二者的区别是堆只能用来存储数据,不能执行代码,而在栈中既可用来存储数据,又可以来执行代码。
2.代码执行过程
- 当js代码块被执行时,其中的数据存储在一个内存空间中,而这个内存空间的别名就是你所定义的变量名。
- 代码执行分为两步:预编译和执行
预编译时会将var 声明的全局变量 和 function声明的函数进行提升。注意:变量仅仅提升的是声明(即变量名)。函数提升的是定义(即函数名和函数体)。在特殊情况下如:一个函数被定义在判断语句中,在预编译时仅仅提升的是函数名(与变量提升一样)。当判断条件为true时,立即将函数体赋值给函数名。另外一种情况是当在代码块中有重名的变量名或者函数名时,对于变量名来说只提升最前面的变量名。对于函数来说只提升最前面的函数定义,对于后面的重名函数,他们的函数名不会再提升,而是将他们的函数体依次赋值给第依次提升的函数名。
执行是按照代码的书写顺序依次执行。
两种情况案例如下:函数在判断语句中例题: var a = 1; if (a == 1) { f(); function f() { console.log('hello'); } } 结果:报错f is not a function
重名函数的例题: fn(); function fn() {console.log(1);} fn(); function fn() {console.log(2);} fn(); var fn = function() {console.log(3);} fn(); function fn() {console.log(4);} fn(); function fn() {console.log(5);} fn(); 结果: 5 5 5 3 3 3
- 在预编译时会申请一段内存空间ECStack(执行上下文栈)用于存储基本数据类型。带var 的全局变量或function 定义的函数名提升,放到 EC(G)(全局执行上下文)的VO(变量对象)中,函数名指向堆的地址,堆中存放引用数据类型的数据,如函数将函数体放在堆中。
- 代码块每调用一次函数,就会形成一个EC(f)(局部执行上下文)将数据存储到EC(f)中的AO中(活动对象)然后进栈,当函数执行完毕 ,出栈 EC(f) 将会销毁,释放存储的数据。(闭包除外)
- 如果在当前的EC(f)局部执行上下文中,没有要输出的数据,将向函数定义的父级中查找。这样一级一级查找数据的过程就形成了作用域链。
- window GO(全局对象)里面存储了默认的数据。全局变量也会存储在EC(G)中。如:在声明变量是没有用var关键字,此时数据保存到GO中。当然带var 的全局变量也会保存到GO中。
接下来用一个例题加深理解
var a = 1; var obj = {name:'wangcai'}; function f() { var a2 = a; obj2 = obj; a2 = a; obj.name = "xiaoqiang"; } f(); console.log(a); //1 console.log(obj); // name:xiaoqiang