龙空技术网

JS中关于堆栈,作用域,声明提升的介绍

码农视界 152

前言:

现时我们对“形参是局部变量还是全局变量”大约比较注意,同学们都想要分析一些“形参是局部变量还是全局变量”的相关知识。那么小编同时在网上汇集了一些关于“形参是局部变量还是全局变量””的相关内容,希望大家能喜欢,大家快快来了解一下吧!

JS中关于堆栈,作用域,声明提升的介绍

//写在前面的话

//web页面是在浏览器端运行,浏览器又分为两大引擎,HTML引擎和JS引擎,HTML引擎用来解析和渲染html和css,

//js引擎用来解析js代码。当js代码载入页面时,js中的变量和函数等都会进入内存当中,并且存在声明的提升。

//其中基本类型的值会在栈区中保存,引用类型会在堆区中保存。而js中的变量或者函数根据所处的作用域不同,又分为全局变量和局部变量。

//全局变量会在页面关闭时,从内存中销毁,而局部变量会在函数执行完毕后,从内存中销毁。

//很多前端开发人员涉及到堆栈,作用域,及声明提升方面的取值问题一直比较模糊,下面就通过具体的代码,帮助大家整理一下思路:

//其实,声明提升虽和常规思维不同,但比较容易掌握,其实只是js引擎内部的一个运行机制而已

//js引擎在解析js时分为两个过程,预编译和执行。预编译时,会将当前环境中的所有声明提升到环境的顶部,全局变量会提升到全局环境的顶部,

//局部变量会提升到函数内的顶部。而代码执行,如赋值,运算等等,在原来的代码所处位置进行

console.log(a);//undefined

var a = 10;

console.log(a);//10

console.log(a);//error a未定义

function foo(){

console.log(a);//undefined

var a = 10;

}

//下面来看一下全局变量和局部变量的情况

var a = 10;

var b = 20;

function foo(){

console.log(a,b);//访问的是全局变量

}

foo();

var a = 10;

var b = 20;

function foo(){

console.log(a,b);//这里的a,b和实参a,b无关,因为没有形参

}

foo(a,b);

var a = 10;

var b = 20;

function foo(x,y){

console.log(a,b);//在函数内没有用到x,y

}

foo(a,b);//实参a,b传给了x,y*/

var a = 10;

var b = 20;

function foo(x,y){

console.log(a,b);//访问全局变量a,b

}

foo();//10,20

var a = 10;

var b = 20;

function foo(a,b){

//形参是局部变量,按照变量的取值顺序(局部变量>形参>全局变量 及 就近原则)

console.log(a,b);//取形参a,b值,

}

foo();//undefined undefined

var a = 10;

var b = 20;

function foo(a,b){

//形参是局部变量,按照变量的取值顺序(局部变量>形参>全局变量 及 就近原则)

//a,b形参

var a = 20;//局部变量a

console.log(a,b);//20,undefined

}

foo(a,b);

var a = 10;

var b = 20;

function foo(){

console.log(a);

var a = 30;

}

foo();//undefined 有局部变量a的存在 不考虑全局变量

var a = 10;

function foo(){

a = 20;//全局变量

}

foo();

console.log(a);//20 在函数内部发生改变

var a = 10;

function foo(){

var a = 20; //在函数调用完成销毁

}

foo();

console.log(a);//10

//下面看下堆栈及参数传递

var a = 10;// a为基本类型,存在栈区

var b = a;

a = 20;

console.log(b);//10

var a1 = [10];//a1为引用类型

var b1 = a1;//将a1的地址给到了b1

a1.push(20);//a1和b1指向了内存中堆区的同一位置

console.log(a1,b1);//[10,20] [10,20]

var a = [10];

function foo(b){

b.push(20);

b = [];//b的地址发生了改变,已经和a不是一个地址

b.push(30);

console.log(b);//[30]

}

foo(a);//传的地址

console.log(a);//[10,20]

标签: #形参是局部变量还是全局变量