首页 > js访问函数作用域外部同名变量

js访问函数作用域外部同名变量

(function(){
    var A = 20;
    function canReadA(){
        console.log(A);
    }

    function cannotReadA(){
        if(false){
            var A = 10;
        }
        console.log(A);
    }
    canReadA();
    cannotReadA();
}());

有什么办法能够在cannotReadA()中访问到A=20的那个变量?除了换一个变量名,或者声明一个外部的命名空间,还有什么方法能够直接做到?比如能不能在当前作用函数域中把这个变量的存在取消掉?


题主可以去看下JS引擎的运行机制,一些东西根本没有暴露出接口来,可能无法访问。


(function(){
    var A = 20;
    var getOuterA = function(){
        return A;
    };
    var setOuterA = function(newVal){
        A = newVal;
    };

    function canReadA(){
        console.log(A);
    }

    function cannotReadA(){
        if(false){
            var A = 10;
        }
        //console.log(A);
        console.log(getOuterA());
        setOuterA(5);
        console.log(getOuterA());
    }
    canReadA();
    cannotReadA();
}());

请借助函数访问,切不可用另一个回答中的this.A=A;方法,这样会创建一个全局的A变量,而且在strict模式下是会报错的。随意地创建全局变量,是很不负责危险的行为。

再更新一个更舒服的方法

(function(){
    var A = 20;
    //使用es5的 getter/setter
    var outerScope = {
        get A(){
            return A;
        },
        set A(val){
            A = val;
        }
    };
    function canReadA(){
        console.log(A);
    }

    function cannotReadA(){
        if(false){
            var A = 10;
        }
        //console.log(A);
        console.log(outerScope.A);
        outerScope.A = 5;
        console.log(outerScope.A);
    }
    canReadA();
    cannotReadA();
}());

    function cannotReadA(){
        if(false){
            A = 10;
        }
        console.log(A);
    }

cannotReadA里面:去掉var就行了。var的话,即使是放在if里面,也会在函数内部定义另外一个作用域为cannotReadA的变量,这时候取到的A自然就是undefined了。


(function(){
    var A = 20;
    this.A=A;   //将A保存到this.A中
    function canReadA(){
        console.log(A);
    }

    function cannotReadA(){
        if(false){
            var A = 10;
        }
        console.log(this.A); //使用self.A 就可以访问到A=20了
    }
    canReadA();
    cannotReadA();
}());

function cannotReadA() {
    if(false){
        var A = 10;
    }
    console.log(A);
}
等价于
function cannotReadA() {
    var A;
    if(false){
        A = 10;
    }
    console.log(A);
}
变量提升,会重新声明一个A,依据作用域链,他会优先使用你新声明的A,所以拿不到外面的A,如果要取到外面的A,可以通过更改变量名来获取。


你是想在cannotReadA这个函数里面,在维持局部定义var A的情况下,再去外部拿到重名变量A吗?
如果要实现这样,你要不把这个变量值挂到某个对象属性上,要不再定义一个中间临时变量temp,然后去拿那个挂载在某个对象上的A的值或者拿那个临时变量temp。

【热门文章】
【热门文章】