javascript基础语法与如何理解堆 栈 以及ECStack,GO

一、什么是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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值