JS运行题常见变量和作用域

原则1:函数调用时候,外层的变量在内部可以找到(全局),内部的变量外部找不到(局部) –>全局变量和局部变量

var a = 10;
function aaa(){
    alert(a);
}
aaa();//10
function aaa(){
    var a = 10;
}
aaa();
alert(a);//undefined
var a = 10;
function aaa(){
    alert(a)
}
function bbb(){
    var a = 20;
    aaa();
}
bbb(); //10 函数调用就是回过头来再走里面

局部变量和全局变量

原则2:当var不添加的时候,会自动生成全局变量(不建议这样写,最好把所有要定义的变量添加上var)

function aaa(){
    var a = 10;
}
aaa();
console.log(a);//报错 a is not defined
function aaa(){
    a = 10;//程序会解析成全局变量,相当于外面定义了一个a
}
aaa();
alert(a); //10
function aaa(){
    var a = b = 10;
}
aaa();
alert(a);//报错 a is not defined
alert(b);//b会变成一个相对全局的变量  //10

原则3:变量的查找是就近原则去寻找var定义的变量,当就近没有找到的话就会查找外层。

var a = 10;
function aaa(){
    alert(a); //undefined
    var a = 20;
}
aaa();

变量查找的就近原则

var a = 10;
function aaa(){
    var a = 20;
    alert(a);//20
}
aaa();
var a = 10;
function aaa(){
    a = 20;
    alert(a);//20
}
aaa();

邻近原则

//找var定义的
var a = 10;
function aaa(){
    alert(a);//10
    a = 20;
}
aaa();
/* a需要去寻找邻近的var,有var = 20,就不可能再找var a = 10了 */
var a = 10;
function aaa(){
    //程序解析的结构 预解析原理
    var a;
    alert(a);//undefined
    a = 20
    alert(a); //20
    var a = 21;
    alert(a)//21
}
aaa();
var a = 10;
function aaa(){
    bbb();
    alert(a);//10
    function bbb(){
        var a = 20;
    }
}
aaa();

原则4:当参数和局部变量重名的时候,优先级是等同的

var a = 10;
function aaa(a){
    alert(a);//10
    var a = 20;
}
aaa(a);

/* 基本类型的赋值只是一个值的复制,并不存在引用的关系 */

var a = 5;
var b = a;
b += 3;
alert(a);//5
/* 对象的引用关系,地址相同在内存中,所以b的修改会影响到a */
var a = [1,2,3];
var b = a;
b.push(4);
alert(a);//1,2,3,4
/* 对象的引用关系,在内存中地址相同,但是b又从新赋值,所以b的地址在内存中发生了改变,与a不在同一个引用上了 */
var a = [1,2,3];
var b = a;
b = [1,2,3,4];
alert(a);//1,2,3
/* 当参数传进来后又对a进行了从新赋值,但由于a是基本类型所以不会影响到外面的变量a */
var a = 10;
function aaa(a){
    a += 3;
    alert(a);//13
}
aaa(a);
alert(a);//10
/* 参数生成了之后,又重新赋值了,而不是在原有的对象上修改,在内存上又生成了一个a */
var a = [1,2,3];
function aaa(a){
    a = [1,2,3,4];
}
aaa(a);
alert(a);//1,2,3
var a = [1,2,3];
function aaa(a){
    a.push(4);
    //alert(a)//1,2,3,4
}
aaa(a);
alert(a);//1,2,3,4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值