前一段时间面试,答完js方面题目后感觉不错,没想到最后结果几乎是全错 ,自认为js还可以的我(主职java)大受打击,决定这一段时间研究一下js面试题
var a = 10;
sayHi();
function sayHi() {
var a = 20;// 有声明
alert(a);
}
alert(a);
20 10
//执行sayHi()中的alert(a)时,js引擎会首先查看sayHi()中有没有声明a变量,有的话则
使用它,如果没有则从他的上一级函数域中取值,一直找到最外层函数域,如果仍没有找到,
就报告该变量未定义;
var a = 10;
sayHi();
function sayHi() {
a = 20;//未声明,使用的是函数外部的a
alert(a);
}
alert(a);
20 20
//由于在sayHi()中使用的是函数外部的a,所以a的值被改写后,在外部可以体现出来
var a = 10;
sayHi();
function sayHi()
{
a = a + 10;
alert(a);
return a;
}
alert(a);
alert(sayHi()+10);
20 20 30 40
//这个函数和上个区别不大,只是要注意执行sayHi()时有一个alert()函数(出这个题的人想法有点不正常 ,开玩笑)
var a = 10;
sayHi();
function sayHi()
{
var a = a + 10;//a已声明,但未赋值
alert(a);
return a;
}
alert(a);
alert(sayHi()+10);
NaN 10 NaN NaN
//本例最关键的一句话就是var a = a + 10;
这句的执行流程是首先运算a + 10,
在第一个例子中说过sayHi()中调用a时会先找本函数内部的a,但这时这时sayHi()中的a为undefined,加10即会转为整形的NaN,而外部的a不会受到内部声明a 值变化的影响(本身他们就是完全不同的两个变量),所以仍然为10;后面的两个NaN跟第一个情况相似,不再具体说明