Javascript引用内部对象的外部对象

时间:2010-05-31 00:48:40

标签: javascript object reference

好的,我看到一些针对Java的引用,但不是javascript(希望你知道它完全不同)。所以这是特定的代码:

function Sandbox() {
    var args = Array.prototype.slice.call(arguments)
        , callback = args.pop()
        , modules = (args[0] && typeof args[0] === 'string' ? args : args[0])
        , i;

    if (!(this instanceof Sandbox)) {
        return new Sandbox(modules, callback);
    }

    if (!modules || modules[0] === '*') {
        modules = [];
        for (i in Sandbox.modules) {
            if (Sandbox.modules.hasOwnProperty(i)) {
                modules.push(i);
            }
        }
    }

    for (i = 0; i < modules.length; i++) {
        Sandbox.modules[modules[i]](this);
    }

    this.core = {
        'exp': {
            'classParser': function (name) {
                return (new RegExp("(^| )" + name + "( |$)"));
            },
            'getParser': /^(#|\.)?([\w\-]+)$/
        },
        'typeOf': typeOf,
        'hasOwnProperty': function (obj, prop) {
            return obj.hasOwnProperty(prop);
        },
        'forEach': function (arr, fn, scope) {
            scope = scope || config.win;
            for (var i = 0, j = arr.length; i < j; i++) {
                fn.call(scope, arr[i], i, arr);
            }
        }
    };

    this.config = {
        'win' : win,
        'doc' : doc
    };

    callback(this);
}

如何从this.core.forEach中访问this.config.win?或者这不可能吗?

2 个答案:

答案 0 :(得分:5)

在Sandbox()函数的主体中,如下所示:

var self = this;

然后;

self.config.win

在核心部分,当上下文敏感的'this'发生了变化时

答案 1 :(得分:1)

您也可以使用函数表达式,但这需要您在this.config之前定义this.core。这可以防止您必须使用局部变量。但请注意,这会捕获值而不是引用它,因此如果您为config分配新值,它将对forEach没有影响。但是,由于未克隆对象,您仍然可以更改config.win。这种行为可能很微妙,如果使用不当会导致错误。

尽管如此,最好按照乔纳森的建议使用var self = this;。然而,这是另一种方法,并且具有有用的情况。

this.config = {
    'win' : "win",
    'doc' : "doc"
};

this.core = {
    'exp': {
        'classParser': function (name) {
            return (new RegExp("(^| )" + name + "( |$)"));
        },
        'getParser': /^(#|\.)?([\w\-]+)$/
    },
    'typeOf': typeOf,
    'hasOwnProperty': function (obj, prop) {
        return obj.hasOwnProperty(prop);
    },
    'forEach': (function(config){
        function (arr, fn, scope) {
            scope = scope || config.win;
            for (var i = 0, j = arr.length; i < j; i++) {
                fn.call(scope, arr[i], i, arr);
            }
        }
    })(this.config)
}