欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-15 12:09:34
...

原则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 函数调用就是回过头来再走里面

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

原则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();

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

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

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

//找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