js 变量提升 变量作用域

变量提升:

变量提升:
代码未执行前,所有的变量的定义优先加载

js代码解析原则:
首先js引擎在读取js代码时会进行两个步骤,第一个步骤是解释,第二个步骤是执行。
所谓解释就是会先通篇扫描所有的Js代码,然后把所有声明提升到顶端,
第二步是执行,执行就是操作一类的

说回主题,直接上栗子吧:
代码:

 var a = 5;
    function fool(){
    a =2
    console.log(a);
    var a;
}
    fool()    //2

我们可以看到,var a;语句并没有刷新a的值,因为,解析编译的时候,’var a;’被提前了.所以我们看的a是内部变量a而不是外面已赋值的5。

再举个例子:

 var a = 5;
    function foo(){
    console.log(a);
    var a =0;
}
    foo()    //undefined   

在这里变量var a 的值被提前执行 ,由于变量提升的原因a已经声明,所以没有输出我们再外部声明的5,但是’a=0;’并没有被提前执行。

所以变量提升这个概念,只适用于声明变量的语句,而变量赋值的语句并不能被提前(如果执行语句可以随意调换顺序,其破坏性可想而知)。


多举一个例子:

<script type="text/javascript">

    console.log(a);  //输出结果 undefined
    var a=10;
</script>

以上代码输出 undefined
原因: 变量提升(把变量声明提升到当前执行环境的最顶端)
上段代码相当于:
var a;
console.log(a); //由于未赋值 所以输出undefined
a=10;
变量提升同函数提升一样。


我们再来看看变量的作用域

变量的作用域

变量的作用域:变量的作用范围
			 根据作用域不同,将变量分为以下两类:
			 (1)全局变量
			 		1.在函数外部定义的变量
			 		2.变量定义时未使用var关键字
			 		3.window对象的属性
			 (2)局部变量
			 		1.在函数内部定义的变量(包含参数位置)

			 总结:
			 	全局变量生命周期较长,占用内存时间长,不利于回收
			 	局部变量生命周期较短,当函数调用完毕时,等待回收,满足快速释放

			 	推荐多使用局部变量,少使用全局变量

在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域。
变量的作用域无非就是两种:全局变量局部变量

其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都有定义。
而在函数之内声明的变量,就只在函数体内部有定义。它们是局部变量,作用域是局部性的
函数的参数也是局部变量,它们只在函数体内部有定义。


以上的过程并不是我们所熟悉的顺序结构,但大致与顺序结构类似只不过是将作用域当作一个整体来看待而已。整个过程示

敲一个代码

var i=10; 
function a() { 
	alert(i); 
}; 
a();

第二个代码

var i=10; 
function a() { 
    alert(i); 
	var i = 2; 
}; 
a(); 

根据编程经验你可能觉得这两个代码输出是一样的,但是事实却是
第一个代码正常输出了变量的值----10,而第二个代码输出的却是undefined
也许很多人理解不了,但是仔细想想我们就很好理解了。

解释:

在变量解析过程中首先查找局部的作用域,然后查找上层作用域。

在代码一的函数当中没有定义变量i,于是查找上层作用域(全局作用域),进而进行输出其值。

但是在代码二的函数内定义了变量i(无论是在alter之后还是之前定义变量,都认为在此作用域拥有变量i),于是不再向上层的作用域进行查找,直接输出i。但是不幸的是此时的局部变量i并没有赋值,所以输出的是undefined。

很多时候认为懂了、理解了,其实没有懂,细细的研究一番之后再下结论




插入一点小知识点:

js中如何输入空格
1.输入HTML标签(&nbsp)
用法:

document.write("&nbsp;"+"1" +"&nbsp;" ;&nbsp;"+"23")

结果:1       23

2.使用css样式来解决
用法:

document.write("<span style='white-space:pre'>" "+"1   2   3"+"</span>);

结果:1 2 3

时间:

setInterval()        每隔固定时间执行代码一次
setTimeout()		 隔固定时间执行代码一次

输出:

console.log('hello');//日志
console.info('hello');//信息
console.error('hello');//错误

javascript 输出:

window.alert()    // 弹出警告框
document.write()   //将内容写入到HTML文档中
innerHTML     写入到HTML元素
console.log()     控制台

JavaScript -确认 (confirm消息对话框)
通常用于允许用户做选择的动作
语法:
confirm(str);
str: 在消息对话框中要显示的文本
返回值:Boolean 类型

返回值:
用户点击“确定” 返回 true
用户点击“取消” 返回false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值