Javascript Ссылка Внешний объект из внутреннего объекта - PullRequest
2 голосов
/ 31 мая 2010

Хорошо, я вижу несколько ссылок на 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.config.win из this.core.forEach? Или это невозможно?

Ответы [ 2 ]

5 голосов
/ 31 мая 2010

в теле функции Sandbox (), например:

var self = this;

, а затем;

self.config.win

в разделе ядра, когда контекстно-зависимое 'this' изменилось

1 голос
/ 31 мая 2010

Вы также можете использовать выражение функции, однако для этого необходимо определить 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...