全局(在函数之外)声明的变量拥有全局作用域。
var name1 = "yao";//全局作用域 //此处可以使用name1 function myFunction(){ //此处也可以使用name1 }
全局变量可以在JavaScript程序中的任何位置访问。
局部(函数内)声明的变量拥有函数作用域。
//这里不可以使用carName function myFunction(){ var carName = 'porsche';//函数作用域 //这里可以使用carName } //这里不可以使用carName
局部变量只能在它们被声明的函数内访问。
通过var
关键词声明的变量没有作用域。
在块{ }内声明的变量可以从块之外进行访问。
{ var x = 10; } //此处可以使用 x
可以通过let
关键词声明拥有块作用域的变量。
在块{ }内声明的变量无法从块外访问。
{ let x = 10; } //此处不可以使用 x
使用var
关键字重新声明变量会带来问题。
在块中重新声明变量也将重新声明块外的变量:
var name = 'yao'; { var name = 'li'; } //此处 name 为 li
使用let
关键字重新声明变量
在块中重新声明变量不会重新声明块外的变量:
var name = 'yao'; { let name = 'li'; } //此处 name 为 yao
在循环中使用var
:
var i = 7; for (var i = 0; i < 10; i++){ //一些代码 } //此处 i 为 7
在循环中使用let
:
let i = 7; for (let i = 0; i < 10; i++){ //一些代码 } //此处 i 为 10
在例子中,在循环中使用的变量使用var
重新声明了循环之外的变量。
在循环中使用的变量使用let
并没有重新声明循环外的变量。
如果在循环中用let
声明了变量 i ,那么只有在循环内,变量 i 才是可见的
在 HTML 中,全局作用域是 window 对象
通过var
关键词定义的全局变量属于 window 对象:
var carName = 'poesche'; //此处的代码可使用 window.carName
通过let
关键词定义的全局变量不属于 window 对象:
let carName = 'Audi'; //此处的代码不可使用 window.carName
允许在程序的任何位置使用var
重新声明 JavaScript 变量:
var x = 10; //现在 x 为 10 var x = 20; //现在 x 为 20
在相同的作用域,或在相同的块中,不允许通过let
重新声明一个var
变量
var x = 10;//允许 let x = 20;//不允许 { var x = 10;//允许 let y = 20;//不允许 }
在相同的作用域,或在相同的块中,不允许通过let
重新声明一个let
变量
let x = 10;//允许 let x = 20;//不允许 { let x = 10;//允许 let x = 20;//不允许 }
在相同的作用域,或在相同的块中,不允许通过var
重新声明一个let
变量
let x = 10;//允许 var x = 20;//不允许 { let x = 10;//允许 var x = 20;//不允许 }
在不同的作用域或块中,允许通过let
重新声明变量、
let x = 20;//允许 { let x = 7;//允许 } { let x = 80;//允许 }
通过var
声明的变量会提升(Hoisting)到顶端,可以在声明变量之前就使用它
<!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>JavaScript 提升</title> </head> <body> <h1>JavaScript 提升</h1> <p>使用<b>var</b>,可以在声明之前使用变量:</p> <p id="demo"></p>//Audi <script> carName = 'Audi'; document.getElementById('demo').innerHTML = carName; var carName; </script> </body> </html>
通过
let
定义的变量不会被提升到顶端在声明
let
变量之前就使用它会导致ReferenceError变量从块的开头一直处于"暂时死区",直到声明为止