面试题2
2018-03-11 本文已影响2人
幸宇
有关前端面试中的运行题,变量的作用域
1.外层的变量,内层阔以找到(全局),内层的变量,外层找不到(局部)
var a=10;
function aa(){
alert(a)
}
function bb(){
var a=20;
aa()
}
bb();// 10;
2.当var 不加的时候,会自动生成全局变量(不建议这样写,最好把所有要定义的变量加上var)
function aa(){
a=10;
}
aa();
alert(a) //10
function aa(){
var a=b=10;
}
aa();
alert(a) //a is not defined;
alert(b) //10;
3.变量的查找是就近原则去找var定义的变量,当就近没有找到的话,就会查找外层
var a=10;
function aa(){
alert(a);//"undefined" 预解析,所以尽量在定义变量的时候尽量写在前面
var a=20
}
aa()
改:
var a=10;
function aa(){
var a=20
alert(a);
}
aa() //"20"
再改:
var a=10;
function aa(){
a=20
alert(a);
}
aa() //"20"
再改:
var a=10;
function aa(){
alert(a);
a=20
}
aa() //"10"
再改:(变量作用域)
var a=10;
function aa(){
bb();
alert(a);
function bb(){
var a=20;
}
}
aa() //10
4.当参数跟局部变量重名的时候,优先级是等同的;
var a=10;
function aa(a){
alert(a);
var a=20;
}
aa(a);//10
5.对象和基本变量之间赋值的差别,对象涉及到地址引用的问题
var a=5;
var b=a;
b+=3;
alert(a)//5
而对象:
var a=[1,2,3];
var b=a;
b.push(4);
alert(a) //1,2,3,4
解决就是给b重新赋值:
var a=[1,2,3];
var b=a;
b=[1,2,3,4]
alert(a) //1,2,3
所以:
var a=10;
function aa(a){
a+=3
}
aa(a)
alert(a) //10 从两个方便都可以解释,第一是从变量赋值的规则上,原来的a的值是不会变的,其次,在外面调用全局变量也只会找到a的值为10;
所以:
var a=[1,2,3]
function aa(a){
a.push(4)
}
aa(a)
alert(a)//1,2,3,4 这里存在对象的地址引用的问题,所以a会是这样
所以,若是重新赋值则会不一样:
var a=[1,2,3]
function aa(a){
a=[1,2,3,4]
}
aa(a)
alert(a)//1,2,3