Javascript.RU

Конструкции языка. Обработка ошибок.

Update: Более новый материал по этой теме находится по адресу https://learn.javascript.ru/while-for.

Раздел иллюстрирует особенности управляющих конструкций javascript, таких как while/for, switch и обработку исключений.

Две формы while:

// проверка вначале
while(i<5) { … }
// условие потом
do { … } while (i<5)

И две принципиально разные формы for. Одна - обычная:

// заметьте - новая переменная объявлена тут же
for (var i=0;i<10;i++) {
   ...
}

Другая - итерация по свойствам объекта:

for(key in obj) {
  ... obj[key]
}

Можно исключить унаследованные свойства (т.е исключить из цикла прототип). Для этого используем функцию hasOwnProperty:

// цикл только по собственным свойствам
for(var key in obj) {
  if (obj.hasOwnProperty(key)) {
    … obj[key] …
  }
}

В javascript можно использовать метки, чтобы прыгать между уровнями цикла.

Метки действуют только для циклов и switch, т.е организовать полноценный goto через них нельзя Sad

На метку внешнего цикла можно перейти при помощи break/continue, вот пример:

// внешний цикл
outer: for(…) {
	…
	// внутренний цикл
	for (…) {
		…
		// можно вывалиться из внешнего цикла
		break outer;
		…
		// или перейти на следующую итерацию внешнего цикла
		continue outer;
		…
	}
}

В некоторых языках можно сделать только switch(число/строка).

В javascript же конструкция switch принимает совершенно любой объект. Перед switch, как и перед циклами можно ставить метку, и делать break/continue на внешнюю метку.

switch (obj) {
case "test":
	…
	break
case 5:
	…
	break outer
default: 
	…
}

With - специфическая конструкция javascript, самый известный ее аналог - with в Pascal/Delphi. Поэтому мы остановимся на ней подольше.

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

Более подробно тема видимости разобрана в статье функции Javascript, а здесь - разберем конкретно то, что с ней делает with.

Коротко - with берет объект и делает из него новую вложенную область видимости.

Например, в некоторой функции:

function go() {
...
var obj

// obj будет браться из текущей области видимости
obj.size = 5
...
}

Создадим тестовый объект, но не просто var obj, а более развернуто:

obj_size

(Более подробно об определении и свойствах объекта написано в разделе Объекты, ООП)

Если мы завернем любые операторы в блок with(obj), то все свойства будут первым делом искаться в obj, а уже потом - во внешней области видимости.

В этом примере свойства weight и size будут взяты из объекта obj:

with (obj) {
	// width/height берутся из найденного size
	return weight / (size.width + size.height)
}

А здесь - with делает область видимости из obj.size:

with (obj.size) {
	return width + height
}

В чем польза with? Как правило, его используют для упрощения синтаксиса, чтобы много раз не повторять объект.

Типичный пример из реальной жизни:

with (div.style) {
	if (!browser.isSafari) {
		position = 'absolute'
	}
	left = 0
	right = 0
	visibility = 'hidden'	
}

Напомню, что интерпретатор javascript ищет все переменные в ближайшей области видимости. Если не находит - ищет в следующей, и так далее - до глобальных переменных, т.е window.
Поэтому можно, например, делать конструкции типа такой:

with (obj) {
	with (size) {
		return weight / (width + height)
	}
}

Здесь переменные из разных областей видимости используются в одном выражении.

with javascript

Область видимости size находится внутри obj, поэтому интерпретатор будет искать weight так:

  1. сначала посмотрит weight в size
  2. не найдет там такой переменной
  3. посмотрит weight в obj
  4. использует weight из obj

Работа с with(obj) не эквивалентна работе напрямую с объектом obj, т.к никаких новых переменных добавить в obj нельзя.

Например, сделаем тестовый объект:

obj = {
	weight: 100
}

mwsnap010.jpg

Внутри with можно получить weight, и даже поменять его значение:

javascript with

Но вот при попытке добавить переменную возникнет проблема:

mwsnap012.jpg

Сам объект не поменялся, зато перезаписали глобальную переменную

alert(obj.size)   // => undefined
alert(window.size)   // => 10

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

А именно - внутри блока with абсолютно нельзя сказать, откуда будет взята та или иная переменная.

Выше разобран пример, когда weight ищется сначала в size, затем в obj, и потом - в глобальной области window.
Если переменной не окажется там, где она по плану должна быть, то она будет взята/изменена в другой области видимости, возможно даже в глобальной window.

Это приводит к трудноуловимым ошибкам, поэтому часто используют альтернативу: временную переменную.

mwsnap013.jpg

С другой стороны, синтаксис with удобнее и полезен там, где ошибок уж точно не может быть. Например, при манипуляции стилями.

Работа с исключениями в javascript организована в типичном для языка стиле вседозволенности.

Абсолютно любой объект можно бросить в виде исключения:

try {
  ...
  throw {message: "Ого!"}
  ..
} catch (e) {
  alert("Ага, попался!")
}

Обычно бросают, все же, не простые объекты, а потомки встроенного класса Error:

throw new Error("connection down, server timeout")
// или сделать наследника Error:
throw new ConnectionError("server timeout")

Встроенный класс Error удобен для унификации проверки "a instanceof Error" и интероперабельности с другими библиотеками, так как ничего полезного в нем часто нет.

В Firefox у объекта Error есть полный бэктрейс в свойстве stack и еще масса полезных свойств:

// так можно быстро узнать стек без отладчика
alert( (new Error()).stack )

В IE тоже есть некоторые полезные свойства, а в Opera/Safari - на момент написания только message:

var e = new Error("hi")
alert(e.message)  // => "hi"

Поэтому, например, у меня созданы потомки (синтаксис фреймворка dojo):

// базовый класс для ошибок, со стеком (Firefox)
// сообщением message и дополнительной информацией extra
dojo.declare(
	"dojo.Error",
	Error,
	function(message, extra) {
		this.message = message;
		this.extra = extra;
		this.stack = (new Error()).stack;	
	}
)
// Потомок, имя ошибки хранится в name
// формат: dojo.declare(Имя, Родитель, Конструктор)
dojo.declare(
	"dojo.CommunicationError",
	dojo.Error,
	function() {
		this.name="CommunicationError";
	}
)

// еще потомок для примера
dojo.declare(
	"dojo.LockedError",
	dojo.Error,
	function() {
		this.name="LockedError";
	}
)
...

При перехвате исключений редко нужно перехватывать все подряд. Обычно - надо перехватить определенный класс исключений. Стандартный оператор catch такого не умеет, поэтому полный код обработки будет выглядить так:

try {
	… код ...
} catch(e) {
	// ловим нужное исключение
	if (e instanceof ConnectionError) {
		// обрабатываем его
		… reconnect …
	} else {
		// пробрасываем незнакомое исключение дальше
		throw e
	}
		
} finally {
	// блок finally выполняется всегда, 
	// вне зависимости - было исключение или нет
	… notifyUser() ..
}

В этом примере также присутствует блок finally, взятый в javascript из java. В стандартной схеме try..catch..finally, код из блока finally выполняется либо после try, если эксепшна нет, либо после catch, даже если эксепшн выпал наружу.

Короче говоря, код в finally выполнится при любом результате работы try/catch, и туда удобно ставить всякие очистки, уведомления о конце процесса и т.п.


Автор: romario (не зарегистрирован), дата: 3 октября, 2008 - 12:16
#permalink

Вопрос к гуру JavaScript: можно ли как-то перехватывать синтаксические ошибки (например, отсутствие скобки какой-нибудь) с помощью try-catch? По умолчанию в IE7 такие ошибки в самом скрипте не перехватываются почему-то, а просто IE выдает свой алерт.


Автор: Илья Кантор, дата: 4 октября, 2008 - 17:30
#permalink

Если скрипт eval'ится - то просто try/catch, а если скрипт загружается с сервера, например, тегом script - и в нем может быть ошибка, то попробуй отловить ее обработчиком window.onerror


Автор: putana (не зарегистрирован), дата: 7 октября, 2008 - 14:31
#permalink

Если надо проерить код на ошибки то
воспользуйся http://jslint.com


Автор: Илья Кантор, дата: 8 октября, 2008 - 09:00
#permalink

Там валидатор вроде очень придирчив к синтаксису, выдает ошибки даже на хорошем коде, не?


Автор: Dmc (не зарегистрирован), дата: 7 декабря, 2008 - 18:40
#permalink

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

PS. Рад что мои строки перевода drupal с drupaler'а столетней давности используются на подобных проектах


Автор: Гость (не зарегистрирован), дата: 27 апреля, 2012 - 10:38
#permalink

ну как сказать, эта придирчивость настраивается, я им уже давно крашу свои скрипты до идеала)


Автор: osama shk (не зарегистрирован), дата: 21 марта, 2020 - 23:15
#permalink

I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article.
マリッジリング


Автор: Артём_ (не зарегистрирован), дата: 22 января, 2009 - 16:31
#permalink

тема достаточно сложная, но расписана очень понятна


Автор: Enoch Root (не зарегистрирован), дата: 7 июля, 2009 - 16:13
#permalink

А можно ли как-то устанавливать таймаут для операций с try-catch? Например, когда используется скрипт от Google Analitycs, а у человека в данный момент нет доступа во внешний интернет? (сайт виден в локальной сети).


Автор: Илья Кантор, дата: 7 июля, 2009 - 21:22
#permalink

Можно выделить операцию отдельно при помощи setTimeout


Автор: Гость (не зарегистрирован), дата: 20 ноября, 2009 - 03:51
#permalink

То что "Метки действуют только для циклов и switch, т.е организовать полноценный goto через них нельзя" это радостное событие, т.к. "полноценный goto" при неправильном использовании делает программу неуправляемой.

А неправильное использование goto - это, банально, непредсказуемость того, в какую точку программы будет передано управление.


Автор: Гость (не зарегистрирован), дата: 8 октября, 2010 - 10:44
#permalink

Здравсвуйте,
меня интересует сказывается ли использование инструкции With на производительности кода??

или более предпочтительно для сокращения кода использовать переменную (s= obj.size) ??

ЗЫ: спасибо за ресурс =)


Автор: Гость (не зарегистрирован), дата: 14 октября, 2010 - 18:40
#permalink

Привет!

Метки действуют только для циклов и switch, т.е организовать полноценный goto через них нельзя Sad

Это ж клево, что нельзя - нам ведь не нужен спагетти-код;)


Автор: Гость (не зарегистрирован), дата: 14 октября, 2010 - 19:03
#permalink

По поводу switch и использование в нем объектов:
Врядли конечно такое пригодится (так как сравнение для неэлементарных типов осуществляется по ссылке), разве только для проверки, не подменил ли кто объект, на который ссылается ссылка.


Автор: Гость (не зарегистрирован), дата: 30 октября, 2011 - 18:20
#permalink
w=window.open(url);

как в скрипте главного окна отследить, что страница не загрузилась?
(нет страницы, отсутствует соединение....)


Автор: Раед, дата: 3 февраля, 2012 - 19:23
#permalink

так и не разобрался с этими исключениями-ошибками. Например:

throw new Error('my error')

и куда всё это полетит, а главное, для чего может использоваться


Автор: nSauk, дата: 29 августа, 2012 - 15:09
#permalink
for(key in obj) {
  ... obj[key]
}

Недавно познакомился с этим видом циклов и сразу заинтересовался производительностью. Я думал, что a in b — что-то вроде обёртки для a < b.length; a++, но, как оказалось, такие циклы работают быстрее на 10–20% в Firefox и Chrome (в других не проверял). Имейте в виду.


Автор: Фёдор Геращенко (не зарегистрирован), дата: 10 апреля, 2013 - 12:57
#permalink

Внутри with можно получить weight, и даже поменять его значение - внутри "obj" и далее по тексту...


Автор: Гость (не зарегистрирован), дата: 3 июля, 2013 - 14:20
#permalink

Здравствуйте, при установке новой версии Mozilla Firefox, исполняемый файл Firefox Setup 22.0.exe, у меня возникла проблема, стало выдавать ошибку Error: illegal operation on WrappedNative prototype object. Какая причина этой ошибки может быть, как ее исправить? Подскажите пожалуйста. Я не программист, но если Вы мне подскажите, что нужно прочесть по теме, чтобы понять алгоритм действия или алгоритм действия, то мне уже будет легче. Заранее благодарна. С Уважением Ксюша.


Автор: find this (не зарегистрирован), дата: 14 февраля, 2020 - 11:19
#permalink

меня возникла проблема, стало выдавать ошибку Error: illegal operation on WrappedNative prototype object. Какая причина этой ошибки может быть, как ее исправить? Подскажите пожалуйста. Я не п


Автор: Гость (не зарегистрирован), дата: 14 октября, 2014 - 20:57
#permalink

Про исключения и Error вообще непонятно о чём речь, рассчитано похоже на продвинутых.


Автор: Stios Jan (не зарегистрирован), дата: 23 декабря, 2019 - 07:11
#permalink

то все свойства будут первым делом искаться в obj, а уже потом - во внешней области видимости.
Free game happy wheels.


Автор: osama shk (не зарегистрирован), дата: 28 января, 2020 - 13:58
#permalink

I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article.
click this site


Автор: osama shk (не зарегистрирован), дата: 30 января, 2020 - 17:49
#permalink

Nice blog and absolutely outstanding. You can do something much better but i still say this perfect.Keep trying for the best.
find this


Автор: osama shk (не зарегистрирован), дата: 2 февраля, 2020 - 15:51
#permalink

You completed a few fine points there. I did a search on the subject and found nearly all persons will go along with with your blog.
https://inlandempirepoolbuilders.com


Автор: osama khi (не зарегистрирован), дата: 2 февраля, 2020 - 18:24
#permalink

I am glad you take pride in what you write. This makes you stand way out from many other writers that push poorly written content.
ataques de ansiedad


Автор: bondos (не зарегистрирован), дата: 10 февраля, 2020 - 22:50
#permalink

Awesome article! I want people to know just how good this information is in your article. It’s interesting, compelling content. Your views are much like my own concerning this subject.
Web Marketing


Автор: osama shk (не зарегистрирован), дата: 12 февраля, 2020 - 17:20
#permalink

I really thank you for the valuable info on this great subject and look forward to more great posts. Thanks a lot for enjoying this beauty article with me. I am appreciating it very much! Looking forward to another great article. Good luck to the author! All the best!
filing for divorce in colorado


Автор: osama shk (не зарегистрирован), дата: 15 февраля, 2020 - 14:22
#permalink

I am very happy to discover your post as it will become on top in my collection of favorite blogs to visit.
rico chandra kusuma


Автор: osama shk (не зарегистрирован), дата: 15 февраля, 2020 - 16:41
#permalink

Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work.
find here


Автор: osama shk (не зарегистрирован), дата: 15 февраля, 2020 - 18:02
#permalink

This content is written very well. Your use of formatting when making your points makes your observations very clear and easy to understand. Thank you.
go here


Автор: osama shk (не зарегистрирован), дата: 15 февраля, 2020 - 18:48
#permalink

I think this is one of the most significant information for me. And i’m glad reading your article. But should remark on some general things, The web site style is perfect, the articles is really great : D. Good job, cheers
family law attorney colorado springs


Автор: osama shk (не зарегистрирован), дата: 17 февраля, 2020 - 14:36
#permalink

Its a great pleasure reading your post.Its full of information I am looking for and I love to post a comment that "The content of your post is awesome" Great work.
crypto news


Автор: osama shk (не зарегистрирован), дата: 17 февраля, 2020 - 17:05
#permalink

I'm glad I found this web site, I couldn't find any knowledge on this matter prior to.Also operate a site and if you are ever interested in doing some visitor writing for me if possible feel free to let me know, i am always look for people to check out my web site.
see this


Автор: osama shk (не зарегистрирован), дата: 17 февраля, 2020 - 18:05
#permalink

Interesting post. I Have Been wondering about this issue, so thanks for posting. Pretty cool post.It 's really very nice and Useful post.Thanks
read the article


Автор: osama shk (не зарегистрирован), дата: 17 февраля, 2020 - 18:42
#permalink

Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work.
look at this


Автор: osama shk (не зарегистрирован), дата: 17 февраля, 2020 - 19:30
#permalink

Thanks a lot for sharing us about this update. Hope you will not get tired on making posts as informative as this.
thefancyvoyager


Автор: john bondjohde (не зарегистрирован), дата: 17 февраля, 2020 - 20:04
#permalink

Your website is really cool and this is a great inspiring article.
go to my blog


Автор: osama shk (не зарегистрирован), дата: 18 февраля, 2020 - 15:34
#permalink

I have read your blog it is very helpful for me. I want to say thanks to you. I have bookmark your site for future updates.
https://arkserverhosting.co.uk


Автор: osama shk (не зарегистрирован), дата: 19 февраля, 2020 - 12:36
#permalink

Thanks for the blog loaded with so many information. Stopping by your blog helped me to get what I was looking for.
battery hair dryer


Автор: john s (не зарегистрирован), дата: 19 февраля, 2020 - 12:59
#permalink

I haven’t any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.
find this


Автор: johnb (не зарегистрирован), дата: 23 февраля, 2020 - 15:30
#permalink

I like this post,And I guess that they having fun to read this post,they shall take a good site to make a information,thanks for sharing it to me.
dji mavic air


Автор: Гость (не зарегистрирован), дата: 24 февраля, 2020 - 12:59
#permalink

Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
Atherosclerosis


Автор: osama shk (не зарегистрирован), дата: 25 февраля, 2020 - 12:05
#permalink

Hi! Thanks for the great information you have provided! You have touched on crucuial points!
dji mavic air


Автор: johnb (не зарегистрирован), дата: 25 февраля, 2020 - 14:31
#permalink

I think this is a really good article. You make this information interesting and engaging. You give readers a lot to think about and I appreciate that kind of writing.
crime scene cleanup


Автор: johnb (не зарегистрирован), дата: 25 февраля, 2020 - 14:31
#permalink

I think this is a really good article. You make this information interesting and engaging. You give readers a lot to think about and I appreciate that kind of writing.
crime scene cleanup


Автор: osama shk (не зарегистрирован), дата: 25 февраля, 2020 - 16:11
#permalink

This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free.
click this site


Автор: johnb (не зарегистрирован), дата: 25 февраля, 2020 - 19:26
#permalink

Thanks for the post and great tips..even I also think that hard work is the most important aspect of getting success.
https://trulylovelykitchen.com


Автор: Гость (не зарегистрирован), дата: 25 февраля, 2020 - 19:51
#permalink

This is a great article thanks for sharing this informative information. I will visit your blog regularly for some latest post.
hair dryers australia


Автор: john bond (не зарегистрирован), дата: 26 февраля, 2020 - 15:44
#permalink

Thanks for the nice blog. It was very useful for me. I'm happy I found this blog. Thank you for sharing with us,I too always learn something new from your post.
Boiler installation


Автор: osama shk (не зарегистрирован), дата: 27 февраля, 2020 - 15:04
#permalink

Nice to be visiting your blog again, it has been months for me. Well this article that i've been waited for so long. I need this article to complete my assignment in the college, and it has same topic with your article. Thanks, great share.
psicologos en Madrid para adolescentes


Автор: Useless Websites (не зарегистрирован), дата: 28 февраля, 2020 - 15:29
#permalink

Автор: johnsss (не зарегистрирован), дата: 29 февраля, 2020 - 12:03
#permalink

This is a smart blog. I mean it. You have so much knowledge about this issue, and so much passion. You also know how to make people rally behind it, obviously from the responses.
Orange County Air Conditioning Home Service


Автор: osama shk (не зарегистрирован), дата: 1 марта, 2020 - 14:43
#permalink

Hi! Thanks for the great information you have provided! You have touched on crucuial points!
psicologos madrid adolescentes


Автор: osama shk (не зарегистрирован), дата: 1 марта, 2020 - 18:17
#permalink

I really loved reading your blog. It was very well authored and easy to undertand. Unlike additional blogs I have read which are really not tht good. I also found your posts very interesting. In fact after reading, I had to go show it to my friend and he ejoyed it as well!
Automotive


Автор: osama shk (не зарегистрирован), дата: 10 марта, 2020 - 17:35
#permalink

I was reading your article and wondered if you had considered creating an ebook on this subject. Your writing would sell it fast. You have a lot of writing talent.
best charcoal grills under 200


Автор: osama shk (не зарегистрирован), дата: 17 марта, 2020 - 19:07
#permalink

Thank you for such a well written article. It’s full of insightful information and entertaining descriptions. Your point of view is the best among many.

エンゲージリング


Автор: osama shk (не зарегистрирован), дата: 19 марта, 2020 - 17:12
#permalink

Only aspire to mention ones content can be as incredible. This clarity with your post is superb and that i may think you’re a guru for this issue. High-quality along with your concur permit me to to seize your current give to keep modified by using approaching blog post. Thanks a lot hundreds of along with you should go on the pleasurable get the job done.
結婚指輪 手作り


Автор: osama shk (не зарегистрирован), дата: 22 марта, 2020 - 21:41
#permalink

nice post, keep up with this interesting work. It really is good to know that this topic is being covered also on this web site so cheers for taking time to discuss this!
婚約指輪 猫


Автор: osama shk (не зарегистрирован), дата: 2 апреля, 2020 - 10:23
#permalink

I recently came across your blog and have been reading along. I thought I would leave my first comment. I don't know what to say except that I have enjoyed reading. Nice blog. I will keep visiting this blog very often.
detoks


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
8 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum