1.域:空间、范围、区域。
如:js必须放在script里,css放在style里,它的作用就是(在一个范围内)读和写
2.浏览器有读js的解析器,当进入script标签后:
- 第1步–预解析:
找到全局的var和function(变量提升),先检查function函数名和内容并储存,当发现重名时,后面的函数覆盖前面的函数;再检查var变量的值并设置undefind,但是发现重名时会自动跳过(包括变量名与函数名相同)
- 第2步–逐行读代码:
在变量在赋值之前值一直是undefind,除非读到=、+、-、*、/、%、++、–、!等表达式,而逐行读到函数时则什么都不会做,直到函数被调用才会执行其内容代码
3.作用域面试题
// //1、
var a=1;
function fn1(){
alert(a);
var a=2;
}
fn1();//undefined
alert(a);//1
//2、
var a=1;
function fn1(){
alert(a);
a=2;
}
fn1();//1
alert(a);//2
//3、
var a=1;
function fn1(a){
alert(a);
a=2;
}
fn1();//undefined
alert(a);//1
//4、
var a=1;
function fn1(){
alert(a);
a=2;
}
fn1(a);//1
alert(a);//2
4.函数内的var定义一个局部变量,没有办法从外面找到函数里面的东西,如:
function fn1(){var a = 'abc';} //在全局里a找不到
//如果想要获取函数里的内容的可以用全局变量储存:
var str = '';
function fn1(){
var a = 'abc';
str = a;
}
fn1();
alert(str);
//还可以使用局部函数调用的方法:
function fn1(){
var a = 'abc';
fn2(a);
}
function fn2(str){
alert(str);
}
5.注意:
if(){}和for(){}的花括号不是作用域
匿名函数如:
window.onload = fucntion(){} //{}里也是一个域,里面的变量也是局部变量
当出现错误的时候,如果不是代码写错了,那就是代码的解析机制想错了