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

查看:159
本文介绍了javascript - 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的那个变量?除了换一个变量名,或者声明一个外部的命名空间,还有什么方法能够直接做到?比如能不能在当前作用函数域中把这个变量的存在取消掉?

解决方案

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

这篇关于javascript - js访问函数作用域外部同名变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆