JavaScript поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð¸Ð½ÑÑÑÑкÑий, оÑобенно ÑпÑавлÑÑÑÐ¸Ñ Ð¸Ð½ÑÑÑÑкÑий, коÑоÑÑе Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ, ÑÑÐ¾Ð±Ñ ÑеализоваÑÑ Ð¸Ð½ÑеÑакÑивноÑÑÑ Ð² ваÑем пÑиложении. Рданной главе даÑÑÑÑ Ð¾Ð±Ð·Ð¾Ñ ÑÑÐ¸Ñ Ð¸Ð½ÑÑÑÑкÑий.
Ðолее подÑÐ¾Ð±Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± инÑÑÑÑкÑиÑÑ
, ÑаÑÑмоÑÑеннÑÑ
в данной главе, ÑодеÑжиÑÑÑ Ð² ÑпÑавоÑнике по JavaScript. ТоÑка Ñ Ð·Ð°Ð¿ÑÑой (;
) иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð½ÑÑÑÑкÑий в коде.
ÐÑбое вÑÑажение (expression) в JavaScript ÑвлÑеÑÑÑ Ñакже инÑÑÑÑкÑией (statement). ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð¾Ð»ÐµÐµ подÑобнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ вÑÑажениÑÑ , пÑоÑиÑайÑе ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ опеÑаÑоÑÑ.
ÐнÑÑÑÑкÑÐ¸Ñ blockÐнÑÑÑÑкÑÐ¸Ñ block ÑвлÑеÑÑÑ ÑÑндаменÑалÑной и иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð³ÑÑппиÑовки дÑÑÐ³Ð¸Ñ Ð¸Ð½ÑÑÑÑкÑий. Ðлок огÑаниÑиваеÑÑÑ ÑигÑÑнÑми Ñкобками:
{ statement_1; statement_2; ... statement_n; }
Ðлок обÑÑно иÑполÑзÑеÑÑÑ Ñ ÑпÑавлÑÑÑими инÑÑÑÑкÑиÑми (напÑимеÑ, if
, for
, while
).
РвÑÑепÑиведÑнном пÑимеÑе { x++; }
ÑвлÑеÑÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð¼.
ÐбÑаÑиÑе внимание: в JavaScript оÑÑÑÑÑÑвÑÐµÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи блока до ECMAScript2015. ÐеÑеменнÑе, обÑÑвленнÑе внÑÑÑи блока, имеÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи ÑÑнкÑии (или ÑкÑипÑа), в коÑоÑой Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð´Ð°Ð½Ð½Ñй блок, вÑледÑÑвие Ñего они ÑÐ¾Ñ ÑанÑÑ Ñвои знаÑÐµÐ½Ð¸Ñ Ð¿Ñи вÑÑ Ð¾Ð´Ðµ за пÑÐµÐ´ÐµÐ»Ñ Ð±Ð»Ð¾ÐºÐ°. ÐÑÑгими Ñловами, блок не ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи. "ÐвÑономнÑе" (standalone) блоки в JavaScript могÑÑ Ð¿ÑодÑÑиÑоваÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¾ÑлиÑаÑÑийÑÑ ÑезÑлÑÑаÑ, Ð¾Ñ ÑезÑлÑÑаÑа в ÑзÑÐºÐ°Ñ C или Java. ÐапÑимеÑ:
var x = 1;
{
var x = 2;
}
console.log(x); // вÑÐ²ÐµÐ´ÐµÑ 2
РвÑÑепÑиведÑнном пÑимеÑе инÑÑÑÑкÑÐ¸Ñ var x
внÑÑÑи блока наÑ
одиÑÑÑ Ð² Ñой же облаÑÑи видимоÑÑи, ÑÑо и инÑÑÑÑкÑÐ¸Ñ var x
пеÑед блоком. Ð C или Java ÑквиваленÑнÑй код вÑÐ²ÐµÐ´ÐµÑ Ð·Ð½Ð°Ñение 1.
ÐаÑÐ¸Ð½Ð°Ñ Ñ ECMAScript 6, опеÑаÑÐ¾Ñ let
позволÑÐµÑ Ð¾Ð±ÑÑвиÑÑ Ð¿ÐµÑеменнÑÑ Ð² облаÑÑи видимоÑÑи блока. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð¾Ð»ÐµÐµ подÑобнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, пÑоÑиÑайÑе let
.
УÑÐ»Ð¾Ð²Ð½Ð°Ñ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ â ÑÑо Ð½Ð°Ð±Ð¾Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, коÑоÑÑе вÑполнÑÑÑÑÑ, еÑли Ñказанное ÑÑловие ÑвлÑеÑÑÑ Ð¸ÑÑиннÑм. JavaScript поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð´Ð²Ðµ ÑÑловнÑе инÑÑÑÑкÑии: if...else
и switch
.
ÐÑполÑзÑйÑе опеÑаÑÐ¾Ñ if
Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½ÑÑÑÑкÑии, еÑли логиÑеÑкое ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑÑинно. ÐÑполÑзÑйÑе опÑионалÑнÑй else
, Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½ÑÑÑÑкÑии, еÑли ÑÑловие ложно. ÐпеÑаÑÐ¾Ñ if вÑглÑÐ´Ð¸Ñ Ñак:
if (condition) {
statement_1;
} else {
statement_2;
}
ÐдеÑÑ condition
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑбÑм вÑÑажением, вÑÑиÑлÑемÑм как иÑÑинное (true) или ложное (false). ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð¾Ð»ÐµÐµ подÑобнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ знаÑениÑÑ
true
и false
, пÑоÑиÑайÑе Boolean. ÐÑли ÑÑловие оÑениваеÑÑÑ ÐºÐ°Ðº true
, Ñо вÑполнÑеÑÑÑ statement_1
, в пÑоÑивном ÑлÑÑае - statement_2
. Ðлоки statement_1
и statement_2
могÑÑ Ð±ÑÑÑ Ð»ÑбÑми блоками, вклÑÑÐ°Ñ Ñакже вложеннÑе инÑÑÑÑкÑии if
.
Также Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе обÑединиÑÑ Ð½ÐµÑколÑко инÑÑÑÑкÑий, полÑзÑÑÑÑ else if
Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи пÑовеÑок ÑÑловий:
if (condition_1) { statement_1;} else if (condition_2) { statement_2;} else if (condition_n) { statement_n; } else { statement_last;}
Ð ÑлÑÑае неÑколÑкиÑ
ÑÑловий ÑолÑко пеÑвое логиÑеÑкое ÑÑловие, коÑоÑое вÑÑиÑлиÑÑÑ Ð¸ÑÑиннÑм (true), бÑÐ´ÐµÑ Ð²Ñполнено. ÐÑполÑзÑйÑе блок ({ ... }
) Ð´Ð»Ñ Ð³ÑÑппиÑовки неÑколÑкиÑ
инÑÑÑÑкÑий. ÐÑименение блоков ÑвлÑеÑÑÑ Ñ
оÑоÑей пÑакÑикой, оÑобенно когда иÑполÑзÑÑÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе инÑÑÑÑкÑии if
:
if (condition) { statement_1_runs_if_condition_is_true; statement_2_runs_if_condition_is_true; } else { statement_3_runs_if_condition_is_false; statement_4_runs_if_condition_is_false; }
ÐежелаÑелÑно иÑполÑзоваÑÑ Ð¿ÑоÑÑÑе пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² ÑÑловном вÑÑажении, Ñ.к. пÑиÑваивание Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑпÑÑано Ñ ÑавенÑÑвом пÑи бÑÑÑÑом пÑоÑмоÑÑе кода. ÐапÑимеÑ, не иÑполÑзÑйÑе ÑледÑÑÑий код:
ÐÑли вам нÑжно иÑполÑзоваÑÑ Ð¿ÑиÑваивание в ÑÑловном вÑÑажении, Ñо ÑаÑпÑоÑÑÑанÑнной пÑакÑикой ÑвлÑеÑÑÑ Ð·Ð°ÐºÐ»ÑÑение опеÑаÑии пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² дополниÑелÑнÑе Ñкобки. ÐапÑимеÑ:
if ((x = y)) {
/* ... */
}
ÐожнÑе знаÑениÑ
СледÑÑÑие знаÑÐµÐ½Ð¸Ñ ÑвлÑÑÑÑÑ Ð»Ð¾Ð¶Ð½Ñми:
false
undefined
null
0
NaN
""
)ÐÑе оÑÑалÑнÑе знаÑениÑ, вклÑÑÐ°Ñ Ð²Ñе обÑекÑÑ, бÑдÑÑ Ð²Ð¾ÑпÑинÑÑÑ ÐºÐ°Ðº иÑÑина пÑи пеÑедаÑе в ÑÑловное вÑÑажение.
Ðе пÑÑайÑе пÑимиÑивнÑе логиÑеÑкие знаÑÐµÐ½Ð¸Ñ true
и false
Ñо знаÑениÑми true и false обÑекÑа Boolean
. ÐапÑимеÑ:
var b = new Boolean(false);
if (b) // ÑÑо ÑÑловие true
if (b == true) // ÑÑо ÑÑловие false
Ð ÑледÑÑÑем пÑимеÑе ÑÑнкÑÐ¸Ñ checkData
возвÑаÑÐ°ÐµÑ true
, еÑли ÑиÑло Ñимволов в обÑекÑе Text
Ñавно ÑÑÑм; в пÑоÑивном ÑлÑÑае ÑÑнкÑÐ¸Ñ Ð¾ÑобÑÐ°Ð¶Ð°ÐµÑ Ð¾ÐºÐ½Ð¾ alert и возвÑаÑÐ°ÐµÑ false
.
function checkData() {
if (document.form1.threeChar.value.length == 3) {
return true;
} else {
alert(
"Enter exactly three characters. " +
document.form1.threeChar.value +
" is not valid.",
);
return false;
}
}
ÐнÑÑÑÑкÑÐ¸Ñ switch
ÐнÑÑÑÑкÑÐ¸Ñ switch
позволÑÐµÑ ÑÑавниÑÑ Ð·Ð½Ð°Ñение вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ ÑазлиÑнÑми ваÑианÑами и пÑи Ñовпадении вÑполниÑÑ ÑооÑвеÑÑÑвÑÑÑий код. ÐнÑÑÑÑкÑÐ¸Ñ Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑий вид:
switch (expression) { case label_1: statements_1 [break;] case label_2: statements_2 [break;] ... default: statements_default [break;] }
СнаÑала пÑоизводиÑÑÑ Ð¿Ð¾Ð¸Ñк веÑви case
Ñ Ð¼ÐµÑкой label
, ÑовпадаÑÑей Ñо знаÑением вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ expression
. ÐÑли Ñовпадение найдено, Ñо ÑооÑвеÑÑÑвÑÑÑий данной веÑви код вÑполнÑеÑÑÑ Ð´Ð¾ опеÑаÑоÑа break
, коÑоÑÑй пÑекÑаÑÐ°ÐµÑ Ð²Ñполнение switch
и пеÑедаÑÑ ÑпÑавление далÑÑе. РпÑоÑивном ÑлÑÑае ÑпÑавление пеÑедаÑÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑной веÑви default
и вÑполнÑеÑÑÑ ÑооÑвеÑÑÑвÑÑÑий ей код. ÐÑли веÑÐ²Ñ default
не найдена, Ñо пÑогÑамма пÑÐ¾Ð´Ð¾Ð»Ð¶Ð¸Ñ Ð²ÑполнÑÑÑÑÑ Ñо ÑÑÑоÑки, ÑледÑÑÑей за инÑÑÑÑкÑией switch
. Ðо ÑоглаÑÐµÐ½Ð¸Ñ Ð²ÐµÑÐ²Ñ default
ÑвлÑеÑÑÑ Ð¿Ð¾Ñледней веÑвÑÑ, но ÑледоваÑÑ ÑÑÐ¾Ð¼Ñ ÑоглаÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±ÑзаÑелÑно.
ÐÑли опеÑаÑÐ¾Ñ break
оÑÑÑÑÑÑвÑеÑ, Ñо поÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°, коÑоÑÑй ÑооÑвеÑÑÑвÑÐµÑ Ð²ÑбÑанной веÑви, наÑнÑÑÑÑ Ð²Ñполнение кода, коÑоÑÑй ÑледÑÐµÑ Ð·Ð° ней.
Ð ÑледÑÑÑем пÑимеÑе еÑли fruittype
Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение "Bananas"
, Ñо бÑÐ´ÐµÑ Ð²Ñведено ÑообÑение "Bananas are $0.48 a pound."
и опеÑаÑÐ¾Ñ break
пÑекÑаÑÐ¸Ñ Ð²Ñполнение switch
. ÐÑли Ð±Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ break
оÑÑÑÑÑÑвовал, Ñо бÑл Ð±Ñ Ñакже вÑполнен код, ÑооÑвеÑÑÑвÑÑÑий веÑви "Cherries"
, Ñ.е. вÑведено ÑообÑение "Cherries are $3.00 a pound."
.
switch (fruittype) {
case "Oranges":
console.log("Oranges are $0.59 a pound.");
break;
case "Apples":
console.log("Apples are $0.32 a pound.");
break;
case "Bananas":
console.log("Bananas are $0.48 a pound.");
break;
case "Cherries":
console.log("Cherries are $3.00 a pound.");
break;
case "Mangoes":
console.log("Mangoes are $0.56 a pound.");
break;
case "Papayas":
console.log("Mangoes and papayas are $2.79 a pound.");
break;
default:
console.log("Sorry, we are out of " + fruittype + ".");
}
console.log("Is there anything else you'd like?");
ÐнÑÑÑÑкÑии обÑабоÑки иÑклÑÑений
ÐнÑÑÑÑкÑÐ¸Ñ throw
иÑполÑзÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð²ÑбÑоÑиÑÑ Ð¸ÑклÑÑение, а инÑÑÑÑкÑÐ¸Ñ try...catch
, ÑÑÐ¾Ð±Ñ ÐµÐ³Ð¾ обÑабоÑаÑÑ.
ÐÑакÑиÑеÑки лÑбой обÑÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÑбÑоÑен как иÑклÑÑение. Тем не менее, не вÑе вÑбÑоÑеннÑе обÑекÑÑ ÑоздаÑÑÑÑ ÑавнÑми. ÐбÑÑно ÑиÑла или ÑÑÑоки вÑбÑаÑÑваÑÑÑÑ ÐºÐ°Ðº иÑклÑÑениÑ, но ÑаÑÑо более ÑÑÑекÑивнÑм ÑвлÑеÑÑÑ Ð¸ÑполÑзование одного из Ñипов иÑклÑÑений, ÑпеÑиалÑно ÑозданнÑÑ Ð´Ð»Ñ ÑÑой Ñели:
ÐнÑÑÑÑкÑÐ¸Ñ throwÐÑполÑзÑйÑе инÑÑÑÑкÑÐ¸Ñ throw
, ÑÑÐ¾Ð±Ñ Ð²ÑбÑоÑиÑÑ Ð¸ÑклÑÑение. ÐÑи вÑбÑоÑе иÑклÑÑÐµÐ½Ð¸Ñ Ð½Ñжно ÑказаÑÑ Ð²ÑÑажение, ÑодеÑжаÑее знаÑение, коÑоÑое бÑÐ´ÐµÑ Ð²ÑбÑоÑено:
throw expression;
ÐÑ Ð¼Ð¾Ð¶ÐµÑе вÑбÑоÑиÑÑ Ð»Ñбое вÑÑажение, а не ÑолÑко вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑнного Ñипа. Ð ÑледÑÑÑем пÑимеÑе вÑбÑаÑÑваÑÑÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ ÑазлиÑнÑÑ Ñипов:
throw "Error2"; // string
throw 42; // number
throw true; // boolean
throw {
toString: function () {
return "I'm an object!";
},
}; // object
ÐÑимеÑание: ÐÑ Ð¼Ð¾Ð¶ÐµÑе вÑбÑоÑиÑÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ°Ðº иÑклÑÑение. ÐÑ Ð¼Ð¾Ð¶ÐµÑе обÑаÑаÑÑÑÑ Ðº ÑвойÑÑвам данного обÑекÑа в блоке catch
.
ÐÑимеÑание: Ð ÑледÑÑÑем пÑимеÑе обÑÐµÐºÑ UserException
вÑбÑаÑÑваеÑÑÑ ÐºÐ°Ðº иÑклÑÑение:
function UserException(message) {
this.message = message;
this.name = "UserException";
}
UserException.prototype.toString = function () {
return this.name + ': "' + this.message + '"';
};
throw new UserException("Value too high");
ÐнÑÑÑÑкÑÐ¸Ñ try...catch
ÐнÑÑÑÑкÑÐ¸Ñ try...catch
ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· блока try
, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð¾Ð´Ð½Ñ Ð¸Ð»Ð¸ неÑколÑко инÑÑÑÑкÑий, и блок catch
, коÑоÑÑе ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑÑÑÑкÑии, опÑеделÑÑÑие поÑÑдок дейÑÑвий пÑи вÑбÑоÑе иÑклÑÑÐµÐ½Ð¸Ñ Ð² блоке try
. ÐнÑми Ñловами, еÑли в блоке try
бÑÐ´ÐµÑ Ð²ÑбÑоÑено иÑклÑÑение, Ñо ÑпÑавление бÑÐ´ÐµÑ Ð¿ÐµÑедано в блок catch
. ÐÑли в блоке try
не Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¸ÑклÑÑений, Ñо блок catch
бÑÐ´ÐµÑ Ð¿ÑопÑÑен. Ðлок finally
бÑÐ´ÐµÑ Ð²Ñполнен поÑле оконÑÐ°Ð½Ð¸Ñ ÑабоÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² try
и catch
, вне завиÑимоÑÑи Ð¾Ñ Ñого, бÑло ли вÑбÑоÑено иÑклÑÑение.
Ð ÑледÑÑÑем пÑимеÑе вÑзÑваеÑÑÑ ÑÑнкÑÐ¸Ñ getMonthName
, коÑоÑÐ°Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ меÑÑÑа по его номеÑÑ. ÐÑли меÑÑÑа Ñ ÑказаннÑм номеÑом не ÑÑÑеÑÑвÑеÑ, Ñо ÑÑнкÑÐ¸Ñ Ð²ÑбÑоÑÐ¸Ñ Ð¸ÑклÑÑение "InvalidMonthNo"
, коÑоÑое бÑÐ´ÐµÑ Ð¿ÐµÑеÑ
ваÑено в блоке catch
:
function getMonthName(mo) {
mo = mo - 1; // Adjust month number for array index (1 = Jan, 12 = Dec)
var months = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
if (months[mo]) {
return months[mo];
} else {
throw "InvalidMonthNo"; //throw keyword is used here
}
}
try {
// statements to try
monthName = getMonthName(myMonth); // function could throw exception
} catch (e) {
monthName = "unknown";
logMyErrors(e); // pass exception object to error handler -> your own
}
Ðлок catch
ÐÑполÑзÑйÑе блок catch
, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÑабоÑаÑÑ Ð¸ÑклÑÑениÑ, ÑгенеÑиÑованнÑе в блоке try
.
catch (catchID) { statements }
JavaScript ÑоздаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ catchID
, коÑоÑÐ¾Ð¼Ñ Ð¿ÑиÑваиваеÑÑÑ Ð¿ÐµÑеÑ
ваÑенное иÑклÑÑение, пÑи вÑ
оде в блок catch
; даннÑй иденÑиÑикаÑÐ¾Ñ Ð´Ð¾ÑÑÑпен ÑолÑко в пÑеделаÑ
блока catch
и ÑниÑÑожаеÑÑÑ Ð¿Ñи вÑÑ
оде из него.
Ð ÑледÑÑÑем пÑимеÑе вÑбÑаÑÑваеÑÑÑ Ð¸ÑклÑÑение, коÑоÑое пеÑеÑ
ваÑÑваеÑÑÑ Ð² блоке catch
:
try {
throw "myException";
} catch (e) {
console.error(e);
}
Ðлок finally
Ðлок finally
ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð´, коÑоÑÑй бÑÐ´ÐµÑ Ð²Ñполнен поÑле оконÑÐ°Ð½Ð¸Ñ ÑабоÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² try
и catch
, но до Ñого, как бÑÐ´ÐµÑ Ð²Ñполнен код, коÑоÑÑй ÑледÑÐµÑ Ð·Ð° инÑÑÑÑкÑией try...catch
. Ðлок finally
вÑполнÑеÑÑÑ Ð²Ð½Ðµ завиÑимоÑÑи Ð¾Ñ Ñого, бÑло ли вÑбÑоÑено иÑклÑÑение. Ðлок finally
вÑполнÑеÑÑÑ Ð´Ð°Ð¶Ðµ в Ñом ÑлÑÑае, еÑли иÑклÑÑение не пеÑеÑ
ваÑÑваеÑÑÑ Ð² блоке catch
.
Ð ÑледÑÑÑем пÑимеÑе оÑкÑÑваеÑÑÑ Ñайл, заÑем в блоке try
пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð²Ñзов ÑÑнкÑии writeMyFile
, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑоÑиÑÑ Ð¸ÑклÑÑение. ÐÑли Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¸ÑклÑÑение, Ñо оно обÑабаÑÑваеÑÑÑ Ð² блоке catch
. РлÑбом ÑлÑÑае Ñайл бÑÐ´ÐµÑ Ð·Ð°ÐºÑÑÑ ÑÑнкÑией closeMyFile
, вÑзов коÑоÑой наÑ
одиÑÑÑ Ð² блоке finally
.
openMyFile();
try {
writeMyFile(theData);
} catch (e) {
handleError(e);
} finally {
closeMyFile();
}
ÐÑли блок finally
возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, Ñо данное знаÑение ÑÑановиÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑм знаÑением вÑей ÑвÑзки try-catch-finally
. ÐнаÑениÑ, возвÑаÑаемÑе блоками try
и catch
, бÑдÑÑ Ð¿ÑоигноÑиÑованÑ.
function f() {
try {
console.log(0);
throw "bogus";
} catch (e) {
console.log(1);
return true; // пÑиоÑÑанавливаеÑÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ° `finally`
console.log(2); // не вÑполнÑеÑÑÑ
} finally {
console.log(3);
return false; // заменÑÐµÑ Ð¿ÑедÑдÑÑий `return`
console.log(4); // не вÑполнÑеÑÑÑ
}
// `return false` вÑполнÑеÑÑÑ ÑейÑаÑ
console.log(5); // не вÑполнÑеÑÑÑ
}
f(); // оÑобÑÐ°Ð¶Ð°ÐµÑ 0, 1, 3 и возвÑаÑÐ°ÐµÑ `false`
Ðамена возвÑаÑаемÑÑ
знаÑений блоком finally
ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð² Ñом ÑиÑле и на иÑклÑÑениÑ, коÑоÑÑе вÑбÑаÑÑваÑÑÑÑ Ð¸Ð»Ð¸ пеÑевÑбÑаÑÑваÑÑÑÑ Ð² блоке catch
:
function f() {
try {
throw "bogus";
} catch (e) {
console.log('caught inner "bogus"');
throw e; // пÑиоÑÑанавливаеÑÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ° `finally`
} finally {
return false; // заменÑÐµÑ Ð¿ÑедÑдÑÑий `throw`
}
// `return false` вÑполнÑеÑÑÑ ÑейÑаÑ
}
try {
f();
} catch (e) {
// Ðе вÑполнÑеÑÑÑ, Ñ.к. `throw` в `catch `заменÑеÑÑÑ Ð½Ð° `return` в `finally`
console.log('caught outer "bogus"');
}
// Ð ÑезÑлÑÑаÑе оÑобÑажаеÑÑÑ ÑообÑение caught inner "bogus"
// и возвÑаÑаеÑÑÑ Ð·Ð½Ð°Ñение `false`
ÐложеннÑе инÑÑÑÑкÑии try...catch
ÐÑ Ð¼Ð¾Ð¶ÐµÑе вкладÑваÑÑ Ð¸Ð½ÑÑÑÑкÑии try...catch
дÑÑг в дÑÑга. ÐÑли внÑÑÑеннÑÑ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ try...catch
не Ð¸Ð¼ÐµÐµÑ Ð±Ð»Ð¾ÐºÐ° catch
, Ñо она должна имеÑÑ Ð±Ð»Ð¾Ðº finally, кÑоме Ñого иÑклÑÑение бÑÐ´ÐµÑ Ð¿ÐµÑеÑ
ваÑено во внеÑнем блоке catch
. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑÑей инÑоÑмаÑии ознакомÑÑеÑÑ Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñми try-блоками.
РзавиÑимоÑÑи Ð¾Ñ Ñипа оÑибки Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÑвойÑÑва name
и message
, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð¾Ð»ÐµÐµ подÑобнÑÑ Ð¸Ð½ÑоÑмаÑиÑ. СвойÑÑво name
ÑодеÑÐ¶Ð¸Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ оÑибки (напÑимеÑ, DOMException
или Error
), ÑвойÑÑво message
â опиÑание оÑибки.
ÐÑли Ð²Ñ Ð²ÑбÑаÑÑваеÑе ÑобÑÑвеннÑе иÑклÑÑениÑ, Ñо ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿ÑеимÑÑеÑÑво, коÑоÑое пÑедоÑÑавлÑÑÑ ÑÑи ÑвойÑÑва (напÑимеÑ, еÑли Ð²Ð°Ñ Ð±Ð»Ð¾Ðº catch
не Ð´ÐµÐ»Ð°ÐµÑ ÑазлиÑий Ð¼ÐµÐ¶Ð´Ñ Ð²Ð°Ñими иÑклÑÑениÑми и ÑиÑÑемнÑми), иÑполÑзÑйÑе конÑÑÑÑкÑÐ¾Ñ Error
. ÐапÑимеÑ:
function doSomethingErrorProne() {
if (ourCodeMakesAMistake()) {
throw new Error("The message");
} else {
doSomethingToGetAJavascriptError();
}
}
try {
doSomethingErrorProne();
} catch (e) {
console.log(e.name); // 'Error'
console.log(e.message); // 'The message' или JavaScript error message
}
ÐбÑÐµÐºÑ Promise
ÐаÑÐ¸Ð½Ð°Ñ Ñ ECMAScript2015, JavaScript поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Promise
, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾ÑложеннÑÑ
и аÑинÑ
ÑоннÑÑ
опеÑаÑий.
ÐбÑÐµÐºÑ Promise
Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°Ñ
одиÑÑÑÑ Ð² ÑледÑÑÑиÑ
ÑоÑÑоÑниÑÑ
:
ÐÑоÑÑой пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов Promise
и XMLHttpRequest
Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпен в ÑепозиÑоÑии MDN promise-test на GitHub. ÐÑ Ñакже можеÑе поÑмоÑÑеÑÑ ÐµÐ³Ð¾ в дейÑÑвии. ÐаждÑй Ñаг пÑокомменÑиÑован, ÑÑо позволÑÐµÑ Ð²Ð°Ð¼ ÑазобÑаÑÑÑÑ Ð² аÑÑ
иÑекÑÑÑе Promise
и XHR. ÐдеÑÑ Ð¿ÑиводиÑÑÑ Ð²ÐµÑÑÐ¸Ñ Ð±ÐµÐ· комменÑаÑиев:
function imgLoad(url) {
return new Promise(function (resolve, reject) {
var request = new XMLHttpRequest();
request.open("GET", url);
request.responseType = "blob";
request.onload = function () {
if (request.status === 200) {
resolve(request.response);
} else {
reject(
Error(
"Image didn't load successfully; error code:" + request.statusText,
),
);
}
};
request.onerror = function () {
reject(Error("There was a network error."));
};
request.send();
});
}
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4