为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MM们 2018-09-06 09:09:52
(function(){     var A = 20;     function canReadA(){         console.log(A);     }     function cannotReadA(){         if(false){             var A = 10;         }         console.log(A);     }     canReadA();     cannotReadA();}());有什么办法能够在cannotReadA()中访问到A=20的那个变量?除了换一个变量名,或者声明一个外部的命名空间,还有什么方法能够直接做到?比如能不能在当前作用函数域中把这个变量的存在取消掉?
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

(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();}());


查看完整回答
反对 回复 2018-09-28
  • 1 回答
  • 0 关注
  • 829 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信