Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > var дважды


Автор: Сisa 26.8.2014, 17:12
Код

try{
var a = 7;
var a = 8;
alert(a)
}catch(e){alert(e.name)}

Ошибку не показывает, значит так можно делать?

Автор: Aliance 27.8.2014, 07:58
А почему нельзя? Просто перетираешь переменную.

Автор: Сisa 27.8.2014, 12:57
Видимо js просто "прощает" подобный кодинг, 
но не везде так:
Код

#!/usr/bin/perl
my $a=7;
my $a=8;
print $a; # -->8

Warning: Content-Type header not found in the script output. If this is not a CGI script, please use the Run -> Run in Command Prompt menu to run it.
"my" variable $a masks earlier declaration in same scope at Untitled line 3.
и это даже без use strict;
scope - разное   smile  

Автор: diadiavova 27.8.2014, 20:56
Цитата(Aliance @  27.8.2014,  08:58 Найти цитируемый пост)
А почему нельзя?

Ну вот объявил ты переменную, она уже где-то раньше была объявлена (возможно даже не в твоем коде и ты не в курсе или просто не помнишь), ты изменяешь ее значение и тот код для которого она была объявлена начинает неправильно работать. Твой код тоже работает неправильно из-за того, что значение переменной изменяет другой код, который имел в виду свою переменную.

Автор: Aliance 28.8.2014, 09:06
diadiavova, ну и кто в этом виноват? ЯП или программист? Чтобы такого не было придумали понятия неймспейсов, скоупа и замыканий.

Автор: Сisa 28.8.2014, 09:29
Нет, ну все хорошо, и то что "прощает", и то что придумали разные понятия, и что перетираешь, и что тестировать надо не абы как, а с усердием. Просто сначала не заостряешь внимание на область видимости и т.п.

Автор: diadiavova 28.8.2014, 13:41
Цитата(Aliance @  28.8.2014,  10:06 Найти цитируемый пост)
diadiavova, ну и кто в этом виноват? ЯП или программист? Чтобы такого не было придумали понятия неймспейсов, скоупа и замыканий. 

Виноват однозначно язык программирования. Я, конечно, понимаю, что если придерживаться определенных правил, то можно избежать множества проблем. И вообще любые недостатки языка вполне можно компенсировать профессионализмом программиста, но, здесь ведь речь не об этом. 
Во-первых, никакие манипуляции не гарантируют, что проблема не возникнет вообще, а стало быть предложенное тобой решение - довольно кривой костыль.
Во-вторых, любая фича, существующая в языке, какую бы потенциальную опасность она ни несла, обычно несет с собой и что-то полезное. Честно говоря, я не могу придумать ни одной ситуации, в которой из возможности повторного объявления переменной можно было бы извлечь хоть какую-то пользу. В этом смысле вообще непонятно для чего надо закладывать такие грабли в язык, ведь ошибки, которые могут от этого возникнуть - отловить довольно трудно, даже имея очень развитые средства отладки, а яваскрипт, насколько мне известно, похвастаться навороченными отладчиками не может. И при этом пользы фича вообще не несет никакой( если ты с этим не согласен, то не сочти за труд и приведи хоть один пример полезности такой фичи).

Ну и в-третьих, если ты пишешь на этом языке много, то знаешь все его "темные стороны", в ином случае будешь судить о поведении кода, исходя из своих знаний, почерпнутых в других языках. А я что-то не припомню, чтобы еще в каких-то языках было что-то подобное.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)