1. 首页 > 电脑手机 >

变量提升是什么意思 什么是变量提升?

var a=0; function fun(){ a++; if(a<=10){ fun(); } console.log(a+=1) } fun();

如果运行结果为11个11的程序输出语句应该是console.log(a)而不是console.log(a+=1).

变量提升是什么意思 什么是变量提升?变量提升是什么意思 什么是变量提升?


因为程序在中间自己调用自己,所以这是递归函数,每次调用fun函数都会被压入递归栈中,

当a大于10时(递归栈压入了10个fun函数后),开始出栈,这时执行每个fun函数的后半部分(输出a),

而这时a已经等于11,所以输出10个11,然后运行初调用fun函数的后半部分(输出a),共输出11个11.

在C语言中的类型自动提升是什么意思?

c语言中对数据进行加减乘除是有规则的,,,他们会把数据先变成同一个数据类型,但是变成哪一个类型呢,所以数据类型是有个变化优先级的,把所有作数变成优先级高的那个进行作。然后在根据用于存放结果的变量类型来判断是否进行截取

int a=1;

double b=2.0;

double c=a+b;

计算c的时候就会把int类型提升为double

就是说一个短数据类型和长数据类型运算短的会自动提升

前端基础进阶(三):变量对象详解,教你如何高逼格地解释变量提升

开年之后工作热情一直不是很高,这几天一直处于消极怠工状态。早上不想起床,起床了不想上班。明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不一样了。我感觉自己得了严重了节后综合征。还好撸了几篇文章,勉强表示这一周的时间没有完全浪费。这篇文章要给大家介绍的是变量对象。

在JaScript中,我们肯定不可避免的需要声明变量和函数,可是JS解析器是如何找到这些变量的呢?我们还得对执行上下文有一个进一步的了解。

在上一篇文章中,我们已经知道,当调用一个函数时(激活),一个新的执行上下文就会被创建。而一个执行上下文的生命周期可以分为两个阶段。

1.创建阶段

在这个阶段中,执行上下文会分别创建变量对象,建立作用域链,以及确定this的指向

2.代码执行阶段

创建完成之后,就会开始执行代码,这个时候,会完成变量赋值,函数引用,以及执行其他代码。

从这里我们就可以看出详细了解执行上下文极为重要,因为其中涉及到了变量对象,作用域链,this等很多人没有怎么弄明白,但是却极为重要的概念,因此它关系到我们能不能真正理解JaScript。在后面的文章中我们会一一详细总结,这里我们先重点了解变量对象。

变量对象(Variable Object)

变量对象的创建,依次经历了以下几个过程。

1.建立arguments对象。检查当前上下文中的参数,建立该对象下的属性与属性值。

2.检查当前上下文的函数声明,也就是使用function关键字声明的函数。在变量对象中以函数名建立一个属性,属性值为指向该函数所在内存地址的引用。如果函数名的属性已经存在,那么该属性将会被新的引用所覆盖。

3.检查当前上下文中的变量声明,每找到一个变量声明,就在变量对象中以变量名建立一个属性,属性值为undefined。如果该变量名的属性已经存在,为了防止同名的函数被修改为undefined,则会直接跳过,原属性值不会被修改。

根据这个规则,理解变量提升就变得十分简单了。在很多文章中虽然提到了变量提升,但是具体是怎么回事还真的很多人都说不出来,以后在面试中用变量对象的创建过程跟面试官解释变量提升,保证瞬间提升逼格。

在上面的规则中我们看出,function声明会比var声明优先级更高一点。为了帮助大家更好的理解变量对象,我们结合一些简单的例子来进行探讨。

// demo01

function test() {

console.log(a);

console.log(foo());

var a = 1;

function foo() {

return 2;

}}

test();在上例中,我们直接从test()的执行上下文开始理解。全局作用域中运行test()时,test()的执行上下文开始创建。为了便于理解,我们用如下的形式来表示

创建过程

testEC = {

// 变量对象

VO: {},

scopeChain: {},

this: {}

}// 因为本文暂时不详细解释作用域链和this,所以把变量对象专门提出来说明

// VO 为 Variable Object的缩写,即变量对象

VO = {

arguments: {...},

foo: // 表示foo的地址引用

a: undefined

}未进入执行阶段之前,变量对象中的属性都不能访问!但是进入执行阶段之后,变量对象转变为了活动对象,里面的属性都能被访问了,然后开始进行执行阶段的作。

这样,如果再面试的时候被问到变量对象和活动对象有什么区别,就又可以自如的应答了,他们其实都是同一个对象,只是处于执行上下文的不同生命周期。

// 执行阶段

VO -> AO // Active Object

AO = {

arguments: {...},

foo: ,

a: 1

}因此,上面的例子demo1,执行顺序就变成了这样

function test() {

function foo() {

return 2;

}var a;

console.log(a);

console.log(foo());

a = 1;

}test();再来一个例子,巩固一下我们的理解。

// demo2

function test() {

console.log(foo);

console.log(bar);

var foo = 'Hello';

console.log(foo);

var bar = function () {

return 'world';

}function foo() {

return 'hello';

}}

test();// 创建阶段

VO = {

arguments: {...},

foo: ,

bar: undefined

}// 这里有一个需要注意的地方,因为var声明的变量当遇到同名的属性时,会跳过而不会覆盖// 执行阶段

VO -> AO

VO = {

arguments: {...},

foo: 'Hello',

bar:

}需要结合上面的知识,仔细对比这个例子中变量对象从创建阶段到执行阶段的变化,如果你已经理解了,说明变量对象相关的东西都已经难不倒你了。

全局上下文的变量对象

以浏览器中为例,全局对象为window。

全局上下文有一个特殊的地方,它的变量对象,就是window对象。而这个特殊,在this指向上也同样适用,this也是指向window。

// 以浏览器中为例,全局对象为window

// 全局上下文

windowEC = {

VO: window,

scopeChain: {},

this: window

}除此之外,全局上下文的生命周期,与程序的生命周期一致,只要程序运行不结束,比如关掉浏览器窗口,全局上下文就会一直存在。其他所有的上下文环境,都能直接访问全局上下文的属性。

两分钟搞懂函数提升与变量提升

先不讲对“函数提升”与“变量提升”的定义,请回答我俩问题:

这里弹出“1”,应该是没什么问题吧?那么再看看下面这个:

相信很多同学会说,这里也是弹出1,没错,答案确实是1。那么我顺便就告诉你,上面的写法2就是所谓的函数提升。概念待会再普及,另外,补充一下,foo()函数这种写法是函数声明式。函数表达式的写法不存在函数提升。

接下来来看变量提升:

以上输出1234应该没异议吧?那么往下看:

请问上面输出的是多少?如果你测试了,就会得到undefined。为啥呢?实际上写法2就相当于:

写法3中,foo()函数里将num变量重新声明,然后弹出num,再给num赋值,那么弹出的自然是未赋值的num,而未赋值的num自然就是undefined。

有同学可能会问,上面的var num = 1234;无效吗?

是的,无效,因为这就是变量提升。变量提升就是:当函数内部定义的一个变量与外部相同时,那么函数体内的这个变量就会被上升到顶端。

那么接下来就是讲函数提升。函数提升的概念就是:在js中,函数的声明会被提升到顶部执行,变量提升也一样。如果函数提升与变量提升同时存在,函数提升优先级高于变量提升(Hosting)。

编程语言中var和let有什么区别?

var是函数作用域,而let是块作用域。在函数内声明了var,整个函数内都是有效的,在for循环内定义了一个var变量,实际上其在for循环以外也是可以访问的,而let由于是块作用域,所以如果在块作用域内(for循环内)定义的变量,在其外面是不可被访问的。

1、如果在全局作用域中用var声明变量,此变量会默认成为window的一个属性,let声明的变量则不会添加到window对象中。

2、在es6之前,是没有块级作用域,所谓块级作用域,就是用{}包含的区域,我们常用的有for,while,if等。但是在块级作用域中用let声明变量,那么此变量就有了块级作用域,就必须只有在此块级作用域才能访问此变量。

3、var声明的变量有变量提升特性,let声明则没有这个特性。变量提升:请点击:jascript中的变量提升的简单说明。

4、var可以允许重复声明相同的变量,后者会覆盖前者,let则不能重复声明相同的变量。

JaScript提升(Hoisting)是什么

Hoisting是JaScript 中的一种机制,它可以将变量和函数的声明移到顶部;让我们可以在声明它们之前使用变量和函数,也就是说:让变量和函数可以先使用再声明。

本篇文章就给大家介绍JaScript的提升机制(Hoisting),让大家了解JS变量提升和函数提升,希望对你们有所帮助。

JaScript的提升机制(Hoisting)仅适用于声明而非初始化;我们在使用变量和函数值之前,需要对它们进行初始化,赋值。【相关视频教程:JaScript教程】

JaScript变量提升

让我们看一下变量提升的简单例子。

//先使用变量 x

x = "Gxl网"; // 初始化变量 x,赋值为"Gxl网"

alert("变量x的值为:"+x); //弹窗显示 x(使用x)

//后声明变量 x

var x; // 变量 x的声明这和下面的变量先声明再使用的例子,结果是一样的。

var x; // 声明 变量 x

x = "Gxl网"; // 初始化变量 x,赋值为"Gxl网"

alert("变量x的值为:"+x); //弹窗显示 x(使用x)输出结果:

注:不可以直接在变量声明时,就初始化。例:

var x="Gxl网";这样是不能提升的,下面我们来看两个例子:

例1:

var x = "Gxl网"; // 声明,初始化变量 x,赋值为"Gxl网"

var y = "网址为:"; // 声明,初始化变量 x,赋值为"Gxl网"

alert(x+"

"+y); //弹窗显示 x(使用x)输出:

例2:

var x = "Gxl网"; // 声明,初始化变量 x,赋值为"Gxl网"

alert(x+"

"+y); //弹窗显示 x(使用x)

var y = "网址为:"; // 声明,初始化变量 x,赋值为"Gxl网"输出:

JaScript函数提升

让我们看一下变量提升的简单例子。

//先使用函数 sum()

alert("

sum()的作用是:让两个数相加求和,则:

"+"sum(10,20)=10+20="+sum(10,20));

//在声明函数sum()

function sum(a,b)

{return a+b;

}这和先声明函数 sum(),在使用,输出结果一样:

//在声明函数sum()

function sum(a,b)

{return a+b;

}//输出函数 sum()

alert("

sum()的作用是:让两个数相加求和,则:

"+"sum(10,20)=10+20="+sum(10,20));效果图:

总结:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息