变量提升:
变量提升:
代码未执行前,所有的变量的定义优先加载
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标签( )
用法:
document.write(" "+"1" +" " ; "+"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