Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему не работает замыкание? (https://javascript.ru/forum/misc/36672-pochemu-ne-rabotaet-zamykanie.html)

Mamayoto 24.03.2013 12:19

Почему не работает замыкание?
 
Объясните пожалуйста, что здесь неправильно? Почему не срабатывает замыкание?
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>

megaupload 24.03.2013 12:32

функция closeNewWindow видна только внутри функции openNewWindow

megaupload 24.03.2013 12:33

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

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 останется в замыкании обеих функций, при том в глобальной области видна не будет а будет видна только им)

Mamayoto 24.03.2013 12:42

Спасибо за исчерпывающий ответ, Вы очень помогли.:)

Ervin 24.03.2013 12:42

Еще один вариант:
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();


Хотя для такой задачи просто две функции куда лучше на мой взгляд.

megaupload 24.03.2013 13:20

не плоди сущности без нужды блеять!

danik.js 24.03.2013 13:25

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

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

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();

megaupload 24.03.2013 16:33

не плоди сущности чувак замыкания учит...

danik.js 24.03.2013 16:42

Так в данном случае один объект с методами выглядит компактнее, и работать с ним удобней, нежели плодить кучу (ну тут две) функций с длиннющими именами + опять же переменная в сторонке.
Сравним:
(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();

megaupload 24.03.2013 17:44



Часовой пояс GMT +3, время: 10:02.