2013-09-11 5 views
1

У меня проблема с областью. У меня есть следующий код, который реализует шаблон раскрывающего модуля:Явный доступ к модулю var из функции модуля при выявлении шаблона модуля

myModule = function(){ 

    var foo = "ohai"; 

    function sayOhai(foo){ 
     alert(foo); 
    }; 

    return{ 
    sayOhai : sayOhai 
    }; 

}(); 

myModule.sayOhai("configData"); 

Это приводит к диалогу «configData».

Однако, я хочу, чтобы функция sayOhai говорила «охай», используя определенный var. Предполагалось, что я не хочу изменять имя параметра sayOhai, как я могу получить доступ к значению foo в sayOhai? Я попробовал alert (this.foo), но это не определено.

Опять же, это теоретический вопрос, поэтому изменение sayOhai(foo) - это не решение, которое я ищу. Имя var и параметр метода должны оставаться неизменными. Итак, из области sayOhai, какое полное имя var foo?

Заранее спасибо

ответ

1

Я хочу, чтобы функция sayOhai сказать «ohai», используя определенный вар. Предполагалось, что я не хочу изменять имя параметра sayOhai, как я могу получить доступ к значению foo в sayOhai?

Вы просто не можете. Var foo затеняется параметром внутренней функции с тем же именем.

+0

По этой причине я использую _foo для внешнего foo. Ваш параметр не ударит по конфликту имен, если вы не используете _ в именах параметров, которые, как я думаю, никто не делает. – Frug

+0

@Frug Конечно, но я не думаю, что это то, что задают. Кстати, это совпадение, что у нас обоих есть один и тот же аватар ?! – bfavaretto

+1

Это странный тип совпадения Эшера и извратил меня, когда я тоже это увидел. – Frug

1

Это не может быть сделано так, как вы просили.

Когда вы определяете var foo = "ohai"; в функции, а затем возвращаете закрытие, foo теперь является приватным.

В функции sayOhai у вас есть аргумент с тем же именем, что и переменная, объявленная выше в лексической области.

Следовательно, аргумент функции по имени foo всегда выигрывает.