在函数的内部,定义name变量,当i等于false时,按照Java语言,else里是拿不到name的,并且会显示报错,
但是却不会报错,这是因为javascript的变量提升机制,它会在‘**’处,定义一个变量:var name;
function aaa(i){
// **
if(i){
var name = "wjdsg";
}else{
console.log(name);
return null;
}
}
aaa(false);
在块中,定义变量:a,在块外面,也可以拿到a
{
var a =1
}
console.log(a)
在java中,变量i是随着for循环结束而销毁,i的作用也只能在for循环中,但是在Javascript中,
在for外也可以取到值
for(var i=0;i<10;i++){
}
console.log(i)
定义两个名字相同的变量也不会报错
var index = 10;
var index = 100;
console.log(index)
解决方法,尽量不要使用:var,
使用块级声明:let和const
const:定义常量,一但被定义,一定要赋值,赋值之后,不能被修改
当用const定义对象的时候,即为常量对象,内存空间不能够覆盖,
但是却可以添加属性:person.age=12;
const person ={
id: 1,
name: "wjdsg"
}
person.id=2,
person.age=12;
console.log(person)
总结,无论是const或者let,都可以解决变量提升的问题
注:for循环不能用const,只能用var或者let
完整代码:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>let和const</title>
</head>
<body>
<script>
/**
* 在函数的内部,定义name变量,当i等于false时,按照Java语言,else里是拿不到name的,并且会显示报错
* 但是却不会报错,这是因为javascript的变量提升机制,它会在‘**’处,定义一个变量:var name;
*/
function aaa(i){
// **
if(i){
var name = "wjdsg";
}else{
console.log(name);
return null;
}
}
aaa(false);
/**
* 在块中,定义变量:a,在块外面,也可以拿到a
*/
{
var a =1
}
console.log(a)
/**
* 在java中,变量i是随着for循环结束而销毁,i的作用也只能在for循环中,但是在Javascript中,
* 在for外也可以取到值
*/
for(var i=0;i<10;i++){
}
console.log(i)
/**
* 定义两个名字相同的变量也不会报错
*/
var index = 10;
var index = 100;
console.log(index)
/**
* 解决方法,尽量不要使用:var,
*
* 使用块级声明:let和const
*
/
/**
* const:定义常量,一但被定义,一定要赋值,赋值之后,不能被修改
* 当用const定义对象的时候,即为常量对象,内存空间不能够覆盖,
* 但是却可以添加属性:person.age=12;
*/
const person ={
id: 1,
name: "wjdsg"
}
person.id=2,
person.age=12;
console.log(person)
/**
* 总结,无论是const或者let,都可以解决变量提升的问题
* 注:for循环不能用const,只能用var或者let
*/
</script>
</body>
</html>