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