Почему не работает замыкание?
Объясните пожалуйста, что здесь неправильно? Почему не срабатывает замыкание?
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> |
функция closeNewWindow видна только внутри функции openNewWindow
|
надо сделать так
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 останется в замыкании обеих функций, при том в глобальной области видна не будет а будет видна только им) |
Спасибо за исчерпывающий ответ, Вы очень помогли.:)
|
Еще один вариант:
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();
Хотя для такой задачи просто две функции куда лучше на мой взгляд. |
не плоди сущности без нужды блеять!
|
Для нескольких инстансов не годится.
А если так, то почему не:
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();
|
не плоди сущности чувак замыкания учит...
|
Так в данном случае один объект с методами выглядит компактнее, и работать с ним удобней, нежели плодить кучу (ну тут две) функций с длиннющими именами + опять же переменная в сторонке.
Сравним:
(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();
|
![]() |
| Часовой пояс GMT +3, время: 07:40. |