<head>
<meta charset="utf-8">
<title>变量</title>
</head>
<script>
/**
* JavaScript的所有变量(包括函数)在整个处理过程中都是存放在内存中的,所以要对一个变量进行处理得先为变量分配内存
* JavaScript支持的数据类型分为两大类:基本数据类型 / 复杂数据类型
* 基本数据类型:1.数字number类型 2.字符串string类型 3.布尔boolean类型 4.未定义undefined类型 5.空null类型
* 复杂数据类型:对象object类型。
* 在JavaScript中除了基本数据类型以外的数据类型全是对象类型
*
* JavaScript中基本数据类型变量分配在栈内存中,其中存放了变量的值,对其是按值来访问的,而对象类型的变量则同时会分配
* 栈内存和堆内存,其中栈内存存放的是地址,堆内存存放的是引用类型的值,栈内存存放的地址指向堆内存中存放的值,对改变量的访问是按引用来访问的->先读取栈内存存放的地址
* 然后按该地址找到堆内存读取其中存放的值
* */
</script>
<script>
function Student(id,sno,name,age){ //函数定义,Student是一个函数变量
this.id = id;
this.sno = sno;
this.name = name;
this.age = age;
}
var num =20;//数字变量
var bol = false;//布尔变量
var str = "student";//字符串变量
var obj = {};//对象变量,在堆内存中创建了一个空对象,该对象的堆内存中的地址被赋给了obj变量
var arr = ['a','b','c'];//数组变量
var student = new Student(1,"202021b21","张三",18);//对象变量,构造函数用于创建对象实例
console.log(student);
/*上述的基本数据类型的变量都存储在栈内存中*/
</script>
<script>
/*变量提升
如果在函数体外定义函数或使用var声明变量,则变量和函数的作用域会提升到整个代码的最高处,此时任何地方访问这个变量和调用这个函数都不会报错;
而在函数体内定义函数或使用var声明变量,变量和函数的作用域则会被提升到整个函数的最高处,此时在函数体内任何地方访问这个变量和调用所定义的函数都不会报错;
*/
//console.log("gv1="+gc);//在声明前访问变量 ,报错undefined
show();//定义前调用函数,报错not defined
var gv = "javascript";
console.log("gv2="+gv);
function show(){
console.log("lv1="+lv);
var lv = "JS";
console.log("lv2="+lv);
}
show();
/*JavaScript代码执行包括两个步骤:预解析处理和逐行解读过程
在预解析过程中,当前作用域中的var变量声明和函数定义江北提升到作用域最高处
*/
</script>
<script>
/*
作用域链:JavaScript运行的时候,需要一些空间来存储脚本所用到的变量,存储变量的这些空间被称为(Scope object)作用域对象,也称为词法作用域。
作用域对象可以有父作用域对象,当脚本代码访问一个变量的时候,JavaScript引擎将在当前的作用域对象中查找这个变量,如果这个变量不存在,JavaScript引擎
就会在父作用域对象中查找这个变量。以此类推,直到找到该变量或者再也没有父作用域对象为止。这个查找变量的过程可能经过的作用域对象就称为作用域链
作用域链中的对象访问顺序为:访问的第一个对象为当前作用域对象,下一个对象来自包含(外部环境),即父作用域对象,再下一个变量对象则来自于下一个包含环境
,即祖父作用域对象,以此类推,一直延续到全局执行环境,即全局作用域对象,全局作用域对象时作用域链中的最后一个对象
注:在JavaScript中,作用域对象是在堆中被创建的,在函数返回后,如果还有其他对象引用他们时,则不会被销毁,所有仍可以被访问。
*/
</script>
JavaScript中变量以及作用域链相关概念
最新推荐文章于 2024-10-02 05:39:15 发布