js复习
一、函数的两种声明方式:
1、 利用函数关键字自定义函数。function fn ( ){ } fn( );
2、函数表达式 var 变量名 = function ( ){ } 变量名();
二、作用域
1、 全局作用域。整个script标签,或是一个单独的js文件。
1.1、 全局变量。a: 在全局作用域下的变量。 b: 如果在函数内部,没有声明直接赋值的变量。
2、 局部作用域。在函数内部就是局部作用域,这个代码的名字只在函数内部起作用。
2.1、 局部变量。函数的形参也可以看作是局部变量。
3、作用域链。内部函数访问外部函数的变量,采用的是链式查找的方式来决定取哪个值,这种结构称为作用域链(一层一层向上查找,就近原则)
三、js预解析
js代码是由浏览器中的js解析器来执行的,js解析器在运行js代码的时候分两步执行:
1、预解析。js解析器会把所有的var和function提升到当前作用域的最前面。(变量提升和函数提升)
1.1、变量提升。就是把所有的变量声明提升到当前的作用域最前面,不提升赋值操作。
1.2、函数提升。就是把所有的函数声明提升到当前作用域的最前面,不调用函数。
2、代码执行。按照代码书写的顺序从上往下执行。
案例:
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
var a = b = c = 6 ;
console.log(a);
console.log(b);
console.log(c);
}
根据js预解析,会将变量和函数做提升。执行过程如下
function f1(){
// var a = b = c = 6 ; // 相当于var a = 6; b = 6; c = 6;只有a定义了变量,而b和c没有定义变量
var a;
a = b = c = 6;
console.log(a); // 结果是6 根据作用域链(就近原则)
console.log(b); // 结果是6 根据作用域链(就近原则
console.log(c); // 结果是6 根据作用域链(就近原则
}
f1();
console.log(c); // 结果是6 因为 虽然b和c写在了函数里面,但他们是全局变量,所以可以用
console.log(b); // 结果是6
console.log(a); // 报错,a is not defined。
注意:若变量有声明,没有赋值,结果是undefuned. 若变量无声明,无赋值,结果会报错,变量 is not defined.