马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
N();
function N(){
console.log('a: ' + a);//undefined
var a = 10;
console.log('a: ' + a);//10
}
M();
function M(){
console.log('b : ' + b)//报错
b = 10;
}
</script>
</head>
<body>
</body>
</html>
这里面包含了JavaScript的两个主题:变量提升(Hoisting)和作用域。
在 JavaScript 中,函数和变量的声明会被提升到他们所在的作用域的顶部。这就是为什么在 N 函数中可以在变量 a 声明之前就使用它。在这个例子中,变量 a 的声明(但不是赋值)被提升,所以在赋值前, a 的值是 undefined 。
然而在 M 函数中,你试图访问一个还没有声明的变量 b 。变量 b 不是一个声明的变量(比如使用 var , let , const 声明),它是一个隐式全局变量。在非严格模式下,尝试在赋值前引用这样的变量不会引发错误,而是将其视为 undefined 。但是在严格模式下( "use strict"; ),这样做会引发 ReferenceError 错误。JavaScript推荐在使用变量之前明确声明它,以此来防止意外创建全局变量。
根据你的代码片段,我猜测可能是运行在严格模式下,这就是为什么尝试引用变量 b 会报错。如果你希望在 M 函数的开始就可以访问变量 b ,你可以在顶部声明它,就像 a 一样。
这就是这段代码的执行方式:在 N 函数中, a 在声明之前就被提升了,而在 M 函数中, b 在声明之前没有被提升。
|