1.var
global = 123
console.log('没有定义的global:', global)
var global; // 变量提升:所有的声明(定义的变量:global)都会提升到作用域的最顶上去
function foo() {
console.log('函数中的global变量:', global)
if (i = 1) {
console.log('if中的global变量:', global)
for (var i = 1; i < 8; i++) {
console.log('for中的global:', global)
}
}
}
foo()
global = 456
console.log('修改后的global:', global)
效果图:
结论:只要var定义了变量(a),可以重复定义,你在任何地方(作用域:访问到变量的区域)都可以访问到变量(a),并且可以修改。
2. let
a = '123'
console.log('没有定义的a:', a) // 报错 Uncaught ReferenceError: Cannot access 'a' before initialization
let a;
效果图:
在这里插入图片描述
let a;
console.log('let定义的a:', a)
a = '123'
console.log('let定义并赋值的a:', a)
function foo() {
console.log('函数中的a变量:', a)
if (i = 1) {
console.log('if中的a变量:',)
for (var i = 1; i < 8; i++) {
console.log('for中的a:', a)
}
}
}
foo()
a = 456
console.log('修改后的a:', a)
结论:使用let定义变量不能重复定义,否则会报错,let可以修改值。
3.const
a = 123
console.log('a:', a) //报错 Uncaught SyntaxError: Missing initializer in const declaration
const a;
const b = 123
console.log('const定义并赋值的b:', b)
function foo() {
console.log('函数中的b变量:', b)
if (i = 1) {
console.log('if中的b变量:',)
for (var i = 1; i < 8; i++) {
console.log('for中的b:', b)
}
}
}
foo()
b = 456
console.log('修改后的b:', b) // Uncaught TypeError: Assignment to constant variable.
结论:const 定义的变量(b)必须赋值,不能重复定义,不能修改值。
const 创建的对象
const obj = {
a: '对象中的a'
}
console.log('obj中的a:', obj.a)
obj.a = '修改对象中obj的a'
console.log('修改obj的a,', obj.a)
为什么没有报错呢?
const定义的对象指针指向的对象地址不可以改变,指向对象地址的内容(obj.变量的值)是可以改变的。对象的内容改变不会影响到指针(obj地址)的改变,对象的属性内容是可以修改的。
const定义基本数据类型(undefined,null,Boolean,Number和String)的变量是不可以修改,其它复杂数据类型(object(对象),(Array)数组)是可以修改的。
总结:
1.var定义的变量存在变量提升(所有的声明都会提升到作用域的最顶上去),可以重复定义,可以在任意地方(作用域中)访问到变量。var 定义的变量可以被修改。
2.let定义的变量不存在变量提升,不可以重复定义,let 定义的变量可以被修改。
3.const定义的变量必须赋值,不存在变量提升,不可以重复定义,const定义的基础数据类型(undefined,null,Boolean,Number和String)的变量不能被修改,但是可以修改复杂数据类型(object(对象),(Array)数组)的属性值。
补充:
块级作用域:由 { } 包裹,其中if和for语句的{ }也属于块作用域。