Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.03.2013, 12:19
Новичок на форуме
Отправить личное сообщение для Mamayoto Посмотреть профиль Найти все сообщения от Mamayoto
 
Регистрация: 28.09.2011
Сообщений: 6

Почему не работает замыкание?
Объясните пожалуйста, что здесь неправильно? Почему не срабатывает замыкание?
function openNewWindow(){
	var wndName = open(
		'http://google.com',
		'',
		'width=400,height=400'
	);
	function closeNewWindow(){
		wndName.close();
	}
}

<a href="javascript:openNewWindow()">Open</a>
<a href="javascript:closeNewWindow()">Close</a>
Ответить с цитированием
  #2 (permalink)  
Старый 24.03.2013, 12:32
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

функция closeNewWindow видна только внутри функции openNewWindow
Ответить с цитированием
  #3 (permalink)  
Старый 24.03.2013, 12:33
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

надо сделать так

var wndName;

function openNewWindow(){
	wndName = open(
		'http://google.com',
		'',
		'width=400,height=400'
	);
}


function closeNewWindow(){
	wndName.close();
}



но тогда у тебя в глобальной области будет переменная wndName что не круто,

по этому круче сделать так

(function(){

var wndName;

window.openNewWindow = function(){
	wndName = open(
		'http://google.com',
		'',
		'width=400,height=400'
	);
}


window.closeNewWindow = function (){
	wndName.close();
}

})();


тогда wndName останется в замыкании обеих функций, при том в глобальной области видна не будет а будет видна только им)

Последний раз редактировалось megaupload, 24.03.2013 в 12:36.
Ответить с цитированием
  #4 (permalink)  
Старый 24.03.2013, 12:42
Новичок на форуме
Отправить личное сообщение для Mamayoto Посмотреть профиль Найти все сообщения от Mamayoto
 
Регистрация: 28.09.2011
Сообщений: 6

Спасибо за исчерпывающий ответ, Вы очень помогли.
Ответить с цитированием
  #5 (permalink)  
Старый 24.03.2013, 12:42
Аспирант
Отправить личное сообщение для Ervin Посмотреть профиль Найти все сообщения от Ervin
 
Регистрация: 19.03.2013
Сообщений: 84

Еще один вариант:
function handleWindow() {
    var wnd = {};
    
    console.log(this);
    this.openWindow = function(url) {
        wnd = open(url);
    }

    this.closeWindow = function() {
        wnd.close();
    }
}

var windowOne = new handleWindow();

windowOne.open("....");
windowOne.close();


Хотя для такой задачи просто две функции куда лучше на мой взгляд.
Ответить с цитированием
  #6 (permalink)  
Старый 24.03.2013, 13:20
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

не плоди сущности без нужды блеять!
Ответить с цитированием
  #7 (permalink)  
Старый 24.03.2013, 13:25
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Для нескольких инстансов не годится.

А если так, то почему не:

var windowHandler = {
    window: null,
    open: function(url) {
        this.window = open(url);
    },
    close: function() {
        this.window.close();
    }
}

windowHandler.open("....");
windowHandler.close();


Для нескольких инстансов:

var windowManager = {
    windows: [],
    open: function(url, name) {
        this.windows[name] = open(url);
    },
    close: function(name) {
        this.windows[name].close();
    }
}

windowManager.open("....", 'MyWindow');
windowManager.close('MyWindow');


Или так:
function WindowHandler {
    this.window = null;
}

WindowHandler.prototype = {
    open: function(url) {
        this.window = open(url);
    },
    close: function() {
        this.window.close();
    }
};

windowHandler = new WindowHandler();
windowHandler.open("....");
windowHandler.close();
Ответить с цитированием
  #8 (permalink)  
Старый 24.03.2013, 16:33
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

не плоди сущности чувак замыкания учит...
Ответить с цитированием
  #9 (permalink)  
Старый 24.03.2013, 16:42
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Так в данном случае один объект с методами выглядит компактнее, и работать с ним удобней, нежели плодить кучу (ну тут две) функций с длиннющими именами + опять же переменная в сторонке.
Сравним:
(function(){
var wndName;
openNewWindow = function(url) {
    wndName = open(url);
};
closeNewWindow = function() {
    wndName.close();
};
})();
openNewWindow('/');
closeNewWindow();


newWindow = {
    window: null,
    open: function(url) {
        this.window = open(url);
    },
    close: function() {
        this.window.close();
    }
};
newWindow.open('/');
newWindow.close();
Ответить с цитированием
  #10 (permalink)  
Старый 24.03.2013, 17:44
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает код gegege Internet Explorer 1 01.08.2011 12:14
Помогите с javascript (Почему не работает) remus Оффтопик 9 09.06.2010 11:18
Почему не работает ? hkaren Events/DOM/Window 2 01.06.2010 16:27
Почему не работает код? JSprog Общие вопросы Javascript 4 16.08.2009 14:39
Почему не работает функция? Vitaly jQuery 10 31.07.2009 17:01