JS命名空间范围:"这个"在里面" var"函数评估为" window"

时间:2016-04-22 17:12:27

标签: javascript jquery namespaces visibility

我有一个包含一些公共方法和一些私有方法的类。公共方法必然会被这个"这个"私有方法使用" var"。

我称之为公共方法" do()"来自课外,有"这个"评估为" MyClass"。但是,如果我进一步打电话给私人"某事()"方法,那么"这个"评估全局命名空间" Window&#34 ;;

function MyClass() {
    // private field
    var keys = ["foo", "bar"];

    // public method
    this.method = function(key) {
        alert(key);
    }

    // private method
    var something = function() {
        console.log("something()");
        console.log(this);
        $.each(keys, function(idx, key){
            this.method(key);
        }.bind(this));
    }

    // public method
    this.do = function() {
        console.log("do()");
        console.log(this);
        something();
    }
}

var test = new MyClass();
test.do();

以上代码作为小提琴:https://jsfiddle.net/lilalinux/13m242ce/8/

据我了解,this.do(在构造函数内部分配)是一个特权"函数,因此应该可以从类外部调用,并允许访问私有成员(这是构造函数的变量和参数)。

1 个答案:

答案 0 :(得分:1)

由于something未与MyClass直接关联,因此其this值不会引用您的MyClass实例。您应该做的是在this之外指定something的引用,并在您的私有函数中引用该变量。

这样的事情:

function MyClass() {
    var self = this; // <-- keep the reference

    // ...

    // private method
    var something = function() {
        console.log("something()");
        console.log(self);
        $.each(keys, function(idx, key){
            self.method(key);
        }.bind(self));
    }

    // ...
}