Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.10.2010, 15:39
Интересующийся
Отправить личное сообщение для FiMko Посмотреть профиль Найти все сообщения от FiMko
 
Регистрация: 24.06.2009
Сообщений: 14

Область видимости внутри функций
Ребята, привет всем!

Мой вопрос скорее всего является очень простым, хотя я и не смог найти ответа в Интернете. Скажите, как перегрузить (переиспользовать) имя переменной внутри функции если имя этой переменной уже назначено одному из параметров функции?

То есть:
function showDialog(title, body) {
	title /* <-еще одна "title" */ = (title /* <-параметр */ != undefined) ? title /* <-параметр */ : "Это заголовок по умолчанию";
}


Соответственно при инициализации переменной title внутри функции хотелось бы использовать именно это имя.

Заранее спасибо за помощь!

Последний раз редактировалось FiMko, 30.10.2010 в 16:08.
Ответить с цитированием
  #2 (permalink)  
Старый 30.10.2010, 16:16
Аватар для vladlen
Кандидат Javascript-наук
Отправить личное сообщение для vladlen Посмотреть профиль Найти все сообщения от vladlen
 
Регистрация: 19.10.2010
Сообщений: 143

Очень плохо искали или не внимательно читали
Ответить с цитированием
  #3 (permalink)  
Старый 30.10.2010, 16:49
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Во-первых, возьми за привычку всегда при объявлении переменных использовать var:
(function(){ title = 'value'; })();
alert(window.title);
Во-вторых, то, что пишется в скобках при объявлении функции - это объявление переменных внутри нее. Т.е.
function(title){... // это
function(){ var title = arguments[0];... // и это - эквивалентно
Учитывая вышесказанное, оптимально будет так:
function showDialog(title, body) {
    if(typeof title == 'undefined') title =  "Это заголовок по умолчанию";
}
Ответить с цитированием
  #4 (permalink)  
Старый 30.10.2010, 16:53
Интересующийся
Отправить личное сообщение для FiMko Посмотреть профиль Найти все сообщения от FiMko
 
Регистрация: 24.06.2009
Сообщений: 14

Судя по всему я запрограммировался :/ пока начал писать, что вопрос не актуален и что, естественно, мой пример будет работать, уже увидел ваши ответы. Однако, большое спасибо за помощь!

Sweet, ваш ответ был особенно полезен, хотя у меня и не возникало проблем с проверками на undef без typeof, но я последовал вашему совету. Я еще использую оператор === при сравнении на undefined.

Ооо, действительно интересно:
Цитата:
if(x === undefined) is testing the value
if (typeof x === undefined) is testing the existence of x
А вот что пишут на javascript.ru:
Сообщение от http://javascript.ru/typeof
В старом javascript-коде можно увидеть применение typeof для проверки существования переменной:
if (typeof(var) == "undefined") { ... }

В современном javascript лучше писать:
if (window.var !== undefined) { ... }

или, зачастую, подойдет и просто:
if (window.var) { ... }

P.S. Использовать просто if(var) нельзя, так как доступ к неопределенной переменной вызовет ошибку. Ну а обращение к отсутствующему свойству глобального объекта window всего лишь вернет undefined

Последний раз редактировалось FiMko, 30.10.2010 в 17:14.
Ответить с цитированием
  #5 (permalink)  
Старый 30.10.2010, 17:07
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от FiMko
Это я обязательно учту, но где же для моего примера воткнуть var?
Это была лирика В твоем примере var как бы используется (читай "во-вторых" в моем предыдущем посте).
Сообщение от FiMko
как перегрузить (переиспользовать) имя переменной внутри функции если имя этой переменной уже назначено одному из параметров функции?
Я хотел сказать, что ничего "перегружать" не нужно, так как параметр функции и есть имя переменной внутри функции. Нужно просто проверить значение этой переменной с помощью typeof title === 'undefined', и если она не имеет значения - присвоить ей значение по умолчанию

Последний раз редактировалось Sweet, 30.10.2010 в 17:10.
Ответить с цитированием
  #6 (permalink)  
Старый 30.10.2010, 17:17
Интересующийся
Отправить личное сообщение для FiMko Посмотреть профиль Найти все сообщения от FiMko
 
Регистрация: 24.06.2009
Сообщений: 14

Сообщение от Sweet Посмотреть сообщение
Я хотел сказать, что ничего "перегружать" не нужно, так как параметр функции и есть имя переменной внутри функции. Нужно просто проверить значение этой переменной с помощью typeof title === 'undefined', и если она не имеет значения - присвоить ей значение по умолчанию
Да, за мой вопрос в начале темы мне уже стыдно, даже не понимаю как это меня так угораздило

Сообщение от Sweet
Это была лирика В твоем примере var как бы используется (читай "во-вторых" в моем предыдущем посте).
Просто решил уточнить, подумалось вдруг я не знаю чего-то такого специфичного из области видимости в javascript
Ответить с цитированием
  #7 (permalink)  
Старый 30.10.2010, 17:18
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Конструкция typeof ... === 'undefined' используется почему, что undefined можно использовать как переменную. Например так:
var someVariable, undefined = 'tra-la-la';
if(someVariable != undefined) alert('o_0');
Ответить с цитированием
  #8 (permalink)  
Старый 30.10.2010, 17:32
Интересующийся
Отправить личное сообщение для FiMko Посмотреть профиль Найти все сообщения от FiMko
 
Регистрация: 24.06.2009
Сообщений: 14

Сообщение от Sweet Посмотреть сообщение
Конструкция typeof ... === 'undefined' используется почему, что undefined можно использовать как переменную.
И это только засоряет язык.

Итак, судя по всему можно писать:
var undefined; // это переменная с именем undefined, ее значение не определено (undefined)
undefined = 1; // значение переменной с именем undefined установлено в 1

if(x) {
    ОШИБКА ВЫПОЛНЕНИЯ: ПЕРЕМЕННАЯ x НЕ ОБЪЯВЛЕНА НИГДЕ В КОДЕ!
}
if (typeof x == undefined) {
    alert("переменная x не объявлена нигде в коде!");
}
if (x === undefined) {
    alert("переменная x не объявлена нигде в коде!");
}
if (!window.x) {
    alert("переменная x не объявлена нигде в коде!");
}
if (window.x === undefined) {
    alert("переменная x не объявлена нигде в коде!");
}
var x = 2;
if (x) {
    // ОСТОРОЖНО! ЕСЛИ x НЕ БЫЛА ОБЪЯВЛЕНА, ТО ОШИБКА ВЫПОЛНЕНИЯ: ПЕРЕМЕННАЯ x НЕ ОБЪЯВЛЕНА НИГДЕ В КОДЕ!
    alert("переменная x объявлена, ее значение определено (не undefined) и ее значение не false и не null");
}
if (x != undefined) {
    // ОСТОРОЖНО! ЕСЛИ x НЕ БЫЛА ОБЪЯВЛЕНА, ТО ОШИБКА ВЫПОЛНЕНИЯ: ПЕРЕМЕННАЯ x НЕ ОБЪЯВЛЕНА НИГДЕ В КОДЕ!
    alert("переменная x объявлена, и ее значение не равно значению переменной с именем undefined");
}
if (x != 'undefined') {
    // ОСТОРОЖНО! ЕСЛИ x НЕ БЫЛА БЫ ОБЪЯВЛЕНА, ТО ОШИБКА ВЫПОЛНЕНИЯ: ПЕРЕМЕННАЯ x НЕ ОБЪЯВЛЕНА НИГДЕ В КОДЕ!
    alert("переменная x объявлена, и ее значение не равно строке 'undefined'");
}

Последний раз редактировалось FiMko, 30.10.2010 в 18:17.
Ответить с цитированием
  #9 (permalink)  
Старый 30.10.2010, 17:43
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от FiMko
переменная x не определена (не объявлена) нигде в коде!
Как раз таки она может и объявлена, но не определена. Кроме предпоследнего примера, потому что:
x = false; // или null
if(!window.x) alert("Но у переменной же есть значение?!");
Ответить с цитированием
  #10 (permalink)  
Старый 30.10.2010, 17:50
Интересующийся
Отправить личное сообщение для FiMko Посмотреть профиль Найти все сообщения от FiMko
 
Регистрация: 24.06.2009
Сообщений: 14

Сообщение от Sweet Посмотреть сообщение
Как раз таки она может и объявлена, но не определена. Кроме предпоследнего примера, потому что:
x = false; // или null
if(!window.x) alert("Но у переменной же есть значение?!");
Тогда не понимаю...
Сообщение от http://javascript.ru/typeof
В старом javascript-коде можно увидеть применение typeof ДЛЯ ПРОВЕРКИ СУЩЕСТВОВАНИЯ!!! переменной:...

В современном javascript, зачастую, подойдет и просто:
if (window.var) { ... }
Значит это неверная формулировка на сайте javascript.ru.

Sweet, если уж вы любезно соглашаетесь помочь, не могли бы привести здесь исправленный (а может и дополненный) вариант приведенных мной выше примеров?

Последний раз редактировалось FiMko, 30.10.2010 в 17:53.
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
область видимости переменных jetli13 Общие вопросы Javascript 3 17.09.2010 11:00
Область видимости внутри функции YISHIMITSY Общие вопросы Javascript 1 25.08.2010 06:50
Область видимости методов mexoboy Общие вопросы Javascript 10 10.08.2010 13:09
Область видимости переменной. noumo Events/DOM/Window 3 03.12.2009 23:48
можно ли включить функцию в глобальную область видимости из файла maxval Элементы интерфейса 13 04.10.2009 07:11