let obj = { key1: val1, key2: val2, foo () { } }
这就是字面量形式,手动声明一个对象的属性和方法,而不是通过构造函数。这样声明简单,但不能复用。 引用
-> 原始类型初始化只能使用字面量形式
原始值和引用值在变量复制时也有差别
1. 原始值的复制是拷贝
2. 引用值的复制实际上是指针的拷贝
ECMAScript中参数传递只有按值传递,它的参数就是局部变量
变量和对象的上下文决定了它们能够访问哪些数据,以及它们的行为。每个上下文都有一个关联的变量对象,而这个上下文中定义的所有变量和函数都存于这个对象上。
全局上下文是最外层的上下文(window,global)
使用let和const的顶级声明不会定义在全局上下文中
当函数执行时,函数的上下文会被推到上下文栈顶,等函数执行结束,就会从上下文栈中弹出。
上下文中的代码在执行的过程中会创建变量对象的一个作用域链。这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。
function layer_1() { let color = 'red'; function layer2() { console.log(color); } layer2(); } layer_1(); // red //-------------------------------------------------------------------// let color = 'blue'; function layer2() { console.log(color); } function layer_1() { let color = 'red'; layer2(); } layer_1(); // blue // 也就是说函数执行的时候的上下文是与函数定义位置的上下文相关的。
如果这里把layer2的定义放到外面就会报错
函数参数被认为是当前上下文中的变量,因此也跟上下文中的其他变量遵循相同的访问规则
console.log(age); // undifined var age = 1;
垃圾回收的基本思路:确定哪个变量不再使用之后,释放它占用的内存。这个过程是周期性的,垃圾回收程序每隔一定时间就会自动运行。
标记未使用的变量:
使用let和const会提高垃圾回收的性能