语句
- JavaScript按行执行,一行就是一个语句,而语句是为了完成某种任务而进行的操作,语句以分号(;)结尾,如:
var i = a + b; /*用var声明变量i,然后将a+b的值赋给i;a+b为表达式*/
-
表达式结尾没有分号,一旦在表达式后面添加分号,则 JavaScript 引擎就将表达式视为语句,这样会产生一些没有任何意义的语句。如:
1.png
变量
- 变量就是给值取名字,变量的名字叫变量。
- JavaScript变量名区分大小写,A和a是两个不同的变量。
- var,变量声明命令,它表示通知解释引擎,要创建一个变量。变量赋值不写var不会报错,但会很容易产生全局变量。
- 变量的声明和赋值。
var i = a + b;
/*实际上,变量的声明和赋值分为两个步骤*/
var i; /*声明变量i*/
i = a + b; /*将表达式a+b的值赋给变量a*/
-
只声明变量却不赋值,该变量的值为undefined。
2.png -
使用变量前要先声明,不然会报错。
3.png - 变量的类型没有限制,变量可以随时更改类型。
var i = 1;
var i = 'abc';
- 声明已经存在的变量是无效的。
var i = 1;
var i; /*此处声明为无效的*/
- 重复声明同一个变量并且赋值,后面的值会把前面的值覆盖掉。
var i = 1;
var i = 2;
/*最终i的值为2*/
- 变量提升
声明一个函数hello
function hello() {
elem = document.getElementById("demo");
elem.innerHTML = x;
var x = 5;
}
这个 var x = 5, 可以认为是两条语句,等价于
var x; // 只有定义(声明)会提升
x = 5; // 初始化值(赋值)这个操作,并不会被提升。
所以上面函数相当于:
function hello() {
var x; // 提升到这了, 默认值为undefined。
elem = document.getElementById("demo");
elem.innerHTML = x; // 这个时候值还是undefined
x = 5;
}
而函数声明,是一个语句,会被提升:
function hello() {
var elem = document.getElementById("demo");
elem.innerHTML = ...
function ok() { // 这是个函数声明语句,会被整体提升
console.log('ok')
}
}
相当于:
function hello() {
function ok() { // 相当于写到最前面了。
console.log('ok')
}
var elem = document.getElementById("demo");
elem.innerHTML = ...
}
这也是为什么说,js的变量作用域是函数作用域的(C,Java等语言的作用域是块级作用域)。因为所有的var和函数声明语句,都会被提升,相当于写在函数的顶部。
这也能初步解释在循环中绑定事件:
function test() {
for (var i = 0; i < lis.length; i++) {
lis[i].addEventListener('click', function() {
console.log(i); // 点击时总是输出 lis.length这个值
});
}
}
因为上面的代码在变量提升后,相当于:
function test() {
var i; // 被提升到这里了,一个函数中就一个i。
for (i = 0; i < lis.length; i++) {
lis[i].addEventListener('click', function() {
console.log(i); // 点击时,i的值固定为循环完成的值。
});
}
}
课上给的方法是:
function test() {
for (var i = 0; i < lis.length; i++) {
addEvent(i);
}
// 调用这个函数多次,每个index都是独立的
function addEvent(index) {
lis[index].addEvent('click', function() {
console.log(index);
});
}
}
elem.innerHTML = x; // 这个x实际上是未定义,所以会报错的,报错了就显示不出来了
x = 5; // 这句话在浏览器,非use-strict模式下会执行成功,表现为给window设置了一个属性, 可以使用 window.x 查看。
网友评论