JavaScript "использовать строгий" и глобальная функция поиска Ника - PullRequest
7 голосов
/ 03 сентября 2011

Итак, я увидел функцию, которая была откровенно прекрасна своей простотой, поскольку она позволяла вам находить глобальный объект (который в зависимости от окружения в то время НЕ мог быть окном), находясь внутри анонимной функции; однако, когда вы бросаете javascripts "использовать строгий"; Режим крошится, из-за оценки ключевого слова «это» меняется. Было несколько способов сделать это?

(function () {
    var win = function () {
        return (function () {
                return this;
            }());
        };
    //win now points to the global object no matter where it is called.
}());

Теперь, если они вызываются в контексте «строгого использования», мы теряем описанную функциональность, есть ли какой-нибудь эквивалент, который можно сделать в строгом режиме ES5?

Для справки

(function () {
    "use strict"
    //code here is in strict mode
}())

Ответы [ 3 ]

8 голосов
/ 08 сентября 2011

Решение:

var global = Function('return this')();

Работает во всех браузерах, двигателях, ES3, ES5, строгом, вложенном объеме и т. Д.

Небольшая вариация пройдет JSLINT:

var FN = Function, global = FN('return this')();

Обсуждение

См. Как получить глобальный объект в JavaScript?

8 голосов
/ 03 сентября 2011

Доступ к глобальному объекту (до ES5)

Если вам нужен доступ к глобальному объекту без жесткого кодирования окна идентификатора, вы можете сделать следующее из любого уровня области действия вложенной функции:

var global = (function () {
    return this;
}());

Таким образом, вы всегда можете получить глобальный объект, потому что внутри функций, которые были вызваны как функции (то есть не как ограничители с новыми), это всегда должно указывать на глобальный объект.объект.

На самом деле это больше не относится к ECMAScript 5 в строгом режиме, поэтому вы должны использовать другой шаблон, когда ваш код находится в строгом режиме.

Например, если вы разрабатываете библиотеку, вы можете заключить код библиотеки в непосредственную функцию (обсуждаемую в главе 4), а затем из глобальной области передать ссылку на это в качестве параметра вашей непосредственной функции..

Доступ к глобальному объекту (после ES5)

Обычно глобальный объект передается в качестве аргумента непосредственной функции, чтобы он был доступен внутри функции.без использования окна: этот способ делает код более совместимым в средах вне браузера:

(function (global) {
    // access the global object via `global`
}(this));

«Шаблоны JavaScript», автор Стоян Стефанов (О'Рейли).Copyright 2010 Yahoo !, Inc., 9780596806750. ”

1 голос
/ 12 января 2012

Вот фрагмент из Perfection Kills , используя глобальный eval.

var root = (function () {
    return this || (0 || eval)('this');
}());

ECMA3, ECMA5, строгий режим и т. Д. Совместимы, передает JSLint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...