| 
	| 
	
	| 
		
	| 
			
			 
			
				11.04.2013, 11:42
			
			
			
		 |  
	| 
		
			
			| что-то знаю       |  | 
					Регистрация: 24.05.2009 
						Сообщений: 5,176
					 
		
 |  |  
	| при включении строгого режима: 
"use strict";
var global = (function(){return this || window})();
alert(global);
 |  |  
	| 
		
	| 
			
			 
			
				11.04.2013, 11:42
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 28.02.2011 
						Сообщений: 351
					 
		
 |  |  
	| 
	
 
	| Сообщение от devote   |  
	| 
var global = window || (function(){return this})();
 |  
	
 Падает, падает. До this  (или во втором примере до (function(){return this})();  ) дело в любом случае не доходит. |  |  
	| 
		
	| 
			
			 
			
				11.04.2013, 11:44
			
			
			
		 |  
	| 
		
			
			| что-то знаю       |  | 
					Регистрация: 24.05.2009 
						Сообщений: 5,176
					 
		
 |  |  
	| 
	
 
	| Сообщение от rgl |  
	| Падает, падает |  
	
 я в курсе, из за отсутствия объявленной переменной. Я исправил выше |  |  
	| 
		
	| 
			
			 
			
				11.04.2013, 11:49
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 28.02.2011 
						Сообщений: 351
					 
		
 |  |  
	| 
	
 
	| Сообщение от devote   |  
	| при включении строгого режима: 
 
"use strict";
var global = (function(){return this || window})();
alert(global);
 |  
	
 А это работает, т.к. до windows дело не доходит, а то бы упало. |  |  
	| 
		
	| 
			
			 
			
				11.04.2013, 11:50
			
			
			
		 |  
	| 
		
			
			| что-то знаю       |  | 
					Регистрация: 24.05.2009 
						Сообщений: 5,176
					 
		
 |  |  
	| 
	
 
	| Сообщение от rgl |  
	| А это работает, т.к. до windows дело не доходит, а то бы упало. |  
	
 в этом случае доходит до window так как включен строгий режим, и this внутри функции равен значению null. Поэтому берется значение из переменной window |  |  
	| 
		
	| 
			
			 
			
				11.04.2013, 12:22
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 28.02.2011 
						Сообщений: 351
					 
		
 |  |  
	| devote,Если windows есть, то да, все нормально, а если нет - ПАДАЕТ.
 Разговор вообще какой-то беспредметный, трудно придумать случай, когда пишущий скрипт не знает, для браузера от пишет или нет, т.е. есть window или нет. Нет, можно конечно писать какие-то универсальные функции, которые потом используются и там и сям, но в этом случае в глобальные переменные лазить не надо. Никогда не надо, но в этом случае - особенно.
 Кста, для экспериментов без браузера использую
 1. Windows Script Host - движок тот же, что у шестого IE, даже под windows 7, в которую входит 9-й IE, в Windows Script Host движок от шестого.
 2. V8 - движок от гугла, тот же, что и в хроме. Можно скачать исходники и собрать.
 Также можно скачать и собрать движок от мозилы Spider Monkey, но я им не пользовался.
 |  |  
	| 
		
	| 
			
			 
			
				11.04.2013, 12:27
			
			
			
		 |  
	| 
		
			
			| что-то знаю       |  | 
					Регистрация: 24.05.2009 
						Сообщений: 5,176
					 
		
 |  |  
	| 
	
 
	| Сообщение от rgl |  
	| Если windows есть, то да, все нормально, а если нет - ПАДАЕТ. |  
	
 то есть и this нет и window нет? хм.. и где такое бывает? хотя даже если и бывает, то решить не сложно:
 
var global = (function(self){return this || typeof window !== 'undefined' && window || self})(this);
Тут у нас получилось простое решение, если нет объекта this (то есть оно равно null) попытаемся получить window, и если и оно не определено, то тогда просто возвращаем ссылку на текущий контекст. |  |  
	| 
		
	| 
			
			 
			
				11.04.2013, 12:36
			
			
			
		 |  
	| 
		
			
			| что-то знаю       |  | 
					Регистрация: 24.05.2009 
						Сообщений: 5,176
					 
		
 |  |  
	| В Node.JS глобальный объект имеет имя global, вот решение с учетом этого: 
var global = (function(self){
    return typeof global !== 'undefined' && global || this || typeof window !== 'undefined' && window || self;
})(this);
 |  |  
	| 
		
	| 
			
			 
			
				11.04.2013, 12:37
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 28.02.2011 
						Сообщений: 351
					 
		
 |  |  
	| 
	
 
	| Сообщение от devote   |  
	| то есть и this нет и window нет? хм.. и где такое бывает? |  
	
 this нет (точнее, null) при "use strict", window нет при программировании не для браузера. Следовательно, и то и другое при сочетании обоих условий. Хотя действительно для сочетания условий надо сделать что-то нетривиальное (напр, скачать и собрать V8), т.к. в браузере есть windows, а под Windows Script Host, как я уже сказал, движок от шестого IE, который не понимает "use strict" |  |  
	| 
		
	| 
			
			 
			
				11.04.2013, 15:29
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 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.
 |  |  |  |