Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 11.04.2013, 11:42
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

при включении строгого режима:
"use strict";
var global = (function(){return this || window})();

alert(global);
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #12 (permalink)  
Старый 11.04.2013, 11:42
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от devote Посмотреть сообщение
var global = window || (function(){return this})();
Падает, падает. До this (или во втором примере до (function(){return this})(); ) дело в любом случае не доходит.
Ответить с цитированием
  #13 (permalink)  
Старый 11.04.2013, 11:44
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от rgl
Падает, падает
я в курсе, из за отсутствия объявленной переменной. Я исправил выше
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #14 (permalink)  
Старый 11.04.2013, 11:49
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от devote Посмотреть сообщение
при включении строгого режима:
"use strict";
var global = (function(){return this || window})();

alert(global);
А это работает, т.к. до windows дело не доходит, а то бы упало.
Ответить с цитированием
  #15 (permalink)  
Старый 11.04.2013, 11:50
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от rgl
А это работает, т.к. до windows дело не доходит, а то бы упало.
в этом случае доходит до window так как включен строгий режим, и this внутри функции равен значению null. Поэтому берется значение из переменной window
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #16 (permalink)  
Старый 11.04.2013, 12:22
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

devote,
Если windows есть, то да, все нормально, а если нет - ПАДАЕТ.
Разговор вообще какой-то беспредметный, трудно придумать случай, когда пишущий скрипт не знает, для браузера от пишет или нет, т.е. есть window или нет. Нет, можно конечно писать какие-то универсальные функции, которые потом используются и там и сям, но в этом случае в глобальные переменные лазить не надо. Никогда не надо, но в этом случае - особенно.
Кста, для экспериментов без браузера использую
1. Windows Script Host - движок тот же, что у шестого IE, даже под windows 7, в которую входит 9-й IE, в Windows Script Host движок от шестого.
2. V8 - движок от гугла, тот же, что и в хроме. Можно скачать исходники и собрать.
Также можно скачать и собрать движок от мозилы Spider Monkey, но я им не пользовался.
Ответить с цитированием
  #17 (permalink)  
Старый 11.04.2013, 12:27
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от rgl
Если windows есть, то да, все нормально, а если нет - ПАДАЕТ.
то есть и this нет и window нет? хм.. и где такое бывает? хотя даже если и бывает, то решить не сложно:
var global = (function(self){return this || typeof window !== 'undefined' && window || self})(this);
Тут у нас получилось простое решение, если нет объекта this (то есть оно равно null) попытаемся получить window, и если и оно не определено, то тогда просто возвращаем ссылку на текущий контекст.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #18 (permalink)  
Старый 11.04.2013, 12:36
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

В Node.JS глобальный объект имеет имя global, вот решение с учетом этого:
var global = (function(self){
    return typeof global !== 'undefined' && global || this || typeof window !== 'undefined' && window || self;
})(this);
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #19 (permalink)  
Старый 11.04.2013, 12:37
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от devote Посмотреть сообщение
то есть и this нет и window нет? хм.. и где такое бывает?
this нет (точнее, null) при "use strict", window нет при программировании не для браузера. Следовательно, и то и другое при сочетании обоих условий. Хотя действительно для сочетания условий надо сделать что-то нетривиальное (напр, скачать и собрать V8), т.к. в браузере есть windows, а под Windows Script Host, как я уже сказал, движок от шестого IE, который не понимает "use strict"
Ответить с цитированием
  #20 (permalink)  
Старый 11.04.2013, 15:29
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Сообщение от rgl
Windows Script Host - движок тот же, что у шестого IE
Но даже здесь есть проблема. Это редкий случай, но если кому-то понадобиться объявить функцию таким способом - это у него не получится. Проверялось на Vista и XP, WSH 5.7.

Простой вызов cscript z.js не вызывает проблем.
z.js
(function(that)
{
	that.a = function()
	{
		WScript.Echo(1);
	};
})(this);

a();


Этот вызов cscript z.wsf приведет к краху скрипта.
z.wsf
<?xml version="1.0" encoding="utf-8" ?>
<package>
<job id="crash">
<script language="javascript" src="z.js"></script>
</job>
</package>


Пока это единственное решение проблемы:
// вариант 1
a.call();
a.apply();

// вариант 2
b = a;
b();


А лучше - отказаться от такого способа объявления функций, или изменить структуру скрипта, чтобы избежать этого.

Последний раз редактировалось with-love-from-siberia, 11.04.2013 в 15:35.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать переменную из JS в PHP методом xhr.send() ? winston3d AJAX и COMET 5 09.02.2013 20:29
Как сделать локальную переменную глобальной?? Дмитрий Общие вопросы Javascript 8 02.11.2010 03:33
Немогу взять id как переменную Влад Общие вопросы Javascript 2 08.07.2009 19:38
Как вывести переменную из php в сценарий Vitaly jQuery 5 02.07.2009 17:54
Как обозначить переменную выбранную в FileChooser? woo_hoo Общие вопросы Javascript 4 03.07.2008 12:58