let a = 100; functionabc(){ let b = 200; functiontest(){ let c = 300; // for循环的代码是可以访问到b变量的 for (let i = 0; i < 3; i++) { let d = 400; console.log(i, d, c, b, a); } } test(); } { let f = 600; functionabd() { let e = 500; console.log(a, e, f); } abd(); } abc(); console.log(a); // for语句块 --> test函数块 --> abc函数块 --> 全局 // abd函数块 --> 局部代码块 --> 全局 // 只要是在作用域链上的变量,从前往后都是可以访问到的
同一个作用域内,使用let声明的变量不能重名,但是var声明的可以重名,只不过是重复定义了
匿名函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
(function () { var a = 100; var b = 200; console.log(a, b); }());
!function () { var a = 100; var b = 200; console.log(a, b); }();
(function (a, b) { console.log(a + b); }(100, 200));
对象
对象的创建
1 2 3
let obj1 = newObject(); let obj2 = Object(); let obj3 = {}; // 隐式创建
对象属性的赋值
1 2 3
let obj3 = {}; obj3.name = "hello"; obj3.age = "3";
对象属性的删除
1
delete obj.name;
属性的访问
1 2
obj.name; obj['name'];
对象创建
1 2 3 4
let obj1 = {a:100 , b:200}; console.log(obj1.a); let obj2 = {'a':100 , 'b':200}; console.log(obj2.a);
属性是变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
let a = 'x'; let b= 'y'; let obj3 = {[a+b]:100}; console.log(obj3xy); // 成功输出 let obj4 = {a+b:100}; console.log(obj4.xy); // 报错 let obj5 = {a:100}; console.log(obj5.x); // undefined,因为没有x属性 let obj6 = {[a]:100}; console.log(obj6.x); // 成功输出
let obj = {}; let s = "xxx"; obj[s] = 100; console.log(obj[s]); console.log(obj.s); // undefined,因为没有s属性,只有xxx属性
let s = Symbol(); let obj = {x: 100, y: 200, z: 300, [s]: 400}; for (const objKey in obj) { console.log(objKey, obj[objKey]); // 无法遍历到Symbol属性 } let ss = Object.getOwnPropertySymbols(obj); console.log(ss);