js作用域。面试题

1.js作用域(全局变量,局部变量)内部可以访问外部,但外部的不能访问内部的

var a=10;
function aaa(){ 
    alert(a);
};
aaa(); //a 为外部变量即全局变量,所以可以直接访问到 结果为10
function aaa(){
var a=10;  
};
aaa();
alert(a); //a 为函数aaa()内部变量量即局部变量,所以无法访问到

var a=10; 
function aaa(){ 
 alert(a);
};            
function bbb(){
var a=20;
aaa();
}
bbb(); //结果为10,因为aaa()函数不能访问到bbb()里面的局部变量,所以访问到的是a=10,这个全局变量。

2.不用var 定义变量时,会默认为是全局变量(不规范,不推荐)

function aaa(){
   a=10; 
}
aaa();
alert(a); //结果为10; 
//等价于:
var a;
function aaa(){
  a=10;
};
aaa();
alert(a);

//给未声明的变量赋值,此变量就会变成全局变量;var a=b=10; 可以解析成 b=10;var a=b; 也就是b为全局变量,a为局部变量,所以外部访问a访问不到,访问b结果为10;

所以为了避免出现这种隐患,我们在定义变量的时候把所有要定义的变量都加上var;

function aaa(){
      var a=b=10; 
}
 aaa();
 alert(a);//结果为,无法访问到
 alert(b);//结果为10;

3.变量的查找是就近原则去寻找,定义的var变量;第二点,变量的声明被提前到作用域顶部,赋值保留在原地,如下dome;

function aaa(){
  alert(a);
  var a=20;
}
aaa(); //结果为:undefined  
/**************/
var a=10;
function aaa(){
  alert(a);
  var a=20;
}
aaa(); //结果为:undefined
可以解析为是:
var a=10;
function aaa(){
  var a; //声明提前了
  alert(a);
  a=20; //赋值扔留着原地
}
aaa();

4.当参数跟局部变量重名的时候,优先级是等同的

var a=10;
function aaa(a){ 
    alert(a);
    var a=20;  //因为 a 是形参,优先级高于 var a; 所以 局部变量a的声明其实被忽略了。
} 
aaa(a); //结果为:10

5.变量修改的时候另一个变量会跟着变化,但是当变量重新被定义时,则另一个不变化

var a=[1,2,3];
var b=a;
b.push(4); 
alert(a);//结果为[1,2,3,4] 当b改变的时候a也发生了改变  

当b重新被赋值的时候 a不会改变.示例:
var a=[1,2,3];
var b=a;
b=[1,2,3,4]
alert(a)//结果为[1,2,3]
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值