声明变量
使用var 声明的变量会自动被添加到最接近的环境中。在函数内部,最接近的环境就是函数的局部环境;在 with 语句中,最接近的环境是函数环境。如果初始化变量时没有使用 var 声明,该变量会自动被添加到全局环境。
function add(num1, num2){
var sum = num1 + num2;
return sum;
}
var result = add(10, 20); //30
console.log(sum); //Uncaught ReferenceError:sum is not defined
如果省略关键字 var,那么当 add() 执行完毕后,sum 也将可以访问到:
function add(num1, num2){
sum = num1 + num2;
return sum;
}
var result = add(10, 20); //30
console.log(sum); //30
查询标识符
当在某个环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表什么。搜索过程从作用域链的顶端开始,向上逐级查询与给定名字匹配的标识符。
var color = 'blue';
function getColor(){
return color;
}
alert(getColor());//blue
var color = 'blue';
function getColor(){
var color = 'red';
return color;
}
alert(getColor());//red
var color = 'blue';
function getColor(){
return color;
var color = 'red';//预编译阶段变量提升 a = undefined
}
alert(getColor());//undefined
var color = 'blue';
function getColor(){
return color;
function color(){
return yellow;
}//预编译阶段变量提升 函数体赋予a
}
alert(getColor());/*function color(){
return yellow;
}*/
JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自5种基本数据类型:Undefined, Null, Boolean, Number 和 String。
- 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
- 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;
- 引用类型的值是对象,保存在堆内存中;
- 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
- 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;
- 确定一个值是哪种基本类型可以使用 typeof 操作符,而确定一个值是哪种引用类型可以使用 instanceof 操作符。
所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)中,执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。 - 执行环境有全局执行环境(也称全局环境)和函数执行环境之分;
- 每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;
- 函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境;
- 全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;
- 变量的执行环境有助于确定应该何时释放内存。
标记清除是目前主流的垃圾收集算法,给当前不使用的值加上标记,然后再回收其内存。
后代选择器
使用后代选择器可以向同类元素应用不同的样式
作为 h1 元素后代的 em 元素的文本变成灰色,其他 em 文本则不会被这个规则选中。
h1 em {color: gray;}
选择子元素
把第一个 h1 下面出现的 strong 元素变成红色,但是第二个 h1 下面出现的 strong 元素不受影响
<style>h1 > strong {color:red;}</style>
<body>
<h1>this is<strong>the first strong</strong></h1>
<h1><em>this is <strong>the second strong</strong></em></h1></body>