显示声明和隐式声明
- 用
var
声明的变量是显示声明,只在当前作用域有效,例如:
<script type="text/javascript">
var username = "xiao";
function getPassword() {
var password = "2333";
console.log("func-username",username);
console.log("func-password",password);
}
getPassword();
console.log("username",username);
console.log("password",password)
</script>

- 直接赋值给一个变量则是隐式声明,无论在哪赋值都是全局作用域
例如:
<script type="text/javascript">
var username = "xiao";
function getPassword() {
password = "2333";
console.log("func-username",username);
console.log("func-password",password);
}
// console.log("before-func-password",password);
getPassword();
console.log("username",username);
console.log("password",password);
</script>

但要是在函数调用前就打印 password 的话则会报错,原因是因为,函数尚未调用,尚未隐式声明password。

注:
var
声明的变量不能用delete
删除,但是var
声明的变量名是 name
的全局变量 居然能直接删除,原因是因为window
对象下已经有一个名为name
的变量,同理要是var
声明一个变量名为location
的变量名也能直接删除。
变量提升
实际上是变量和函数的声明提升
用 var
和 function
在全局或者局部作用域声明变量时,会将声明替提升到当前范围的顶端。
例如:
<script type="text/javascript">
var username = "xiao";
function getUsername() {
console.log(username);
var username = "ming";
console.log(username);
}
getUsername();
</script>
以前我天真的以为,会输出xiao ming

但实际上因为变量声明提升的原因,上面代码相当于:
<script type="text/javascript">
var username;
username = "xiao";
function getUsername() {
var username;
console.log(username);
username = "ming";
console.log(username);
}
getUsername();
</script>
let
没有声明提升,例如
<script type="text/javascript">
function getPassword() {
console.log(password);
let password = "2333";
console.log(password);
}
getPassword();
</script>

网友评论