Режим strict (ÑÑÑогий Ñежим), введÑннÑй в ECMAScript 5, позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð±Ð¾Ð»ÐµÐµ ÑÑÑогий ваÑÐ¸Ð°Ð½Ñ JavaScript. ÐÑо не пÑоÑÑо подмножеÑÑво ÑзÑка: в нем ÑознаÑелÑно иÑполÑзÑеÑÑÑ ÑеманÑика, оÑлиÑаÑÑаÑÑÑ Ð¾Ñ Ð¾Ð±ÑÑно пÑинÑÑой. Ðе поддеÑживаÑÑие ÑÑÑогий Ñежим бÑаÑзеÑÑ Ð±ÑдÑÑ Ð¿Ð¾-дÑÑÐ³Ð¾Ð¼Ñ Ð²ÑполнÑÑÑ ÐºÐ¾Ð´, напиÑаннÑй Ð´Ð»Ñ ÑÑÑогого Ñежима, поÑÑÐ¾Ð¼Ñ Ð½Ðµ полагайÑеÑÑ Ð½Ð° ÑÑÑогий Ñежим без ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки иÑполÑзÑемÑÑ Ð¾ÑобенноÑÑей ÑÑого Ñежима. СÑÑогий и обÑÑнÑй Ñежим могÑÑ ÑоÑÑÑеÑÑвоваÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно, а ÑкÑÐ¸Ð¿Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑеклÑÑаÑÑÑÑ Ð² ÑÑÑогий Ñежим по меÑе надобноÑÑи.
СÑÑогий Ñежим пÑинÑÑ ÑÑд изменений в обÑÑнÑÑ ÑеманÑÐ¸ÐºÑ JavaScript. Ðо-пеÑвÑÑ , ÑÑÑогий Ñежим заменÑÐµÑ Ð¸ÑклÑÑениÑми некоÑоÑÑе оÑибки, коÑоÑÑе инÑеÑпÑеÑаÑÐ¾Ñ JavaScript Ñанее молÑа пÑопÑÑкал. Ðо-вÑоÑÑÑ , ÑÑÑогий Ñежим иÑпÑавлÑÐµÑ Ð¾Ñибки, коÑоÑÑе меÑали движкам JavaScript вÑполнÑÑÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ â в некоÑоÑÑÑ ÑлÑÑаÑÑ ÐºÐ¾Ð´ в ÑÑÑогом Ñежиме Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑимизиÑован Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ бÑÑÑÑого вÑполнениÑ, Ñем код в обÑÑном Ñежиме. Ð-ÑÑеÑÑÐ¸Ñ , ÑÑÑогий Ñежим запÑеÑÐ°ÐµÑ Ð¸ÑполÑзоваÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑлеменÑÑ ÑинÑакÑиÑа, коÑоÑÑе, веÑоÑÑно, в ÑледÑÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ ECMAScript полÑÑÐ°Ñ Ð¾ÑобÑй ÑмÑÑл.
ÐÑли Ð²Ñ Ñ
оÑиÑе измениÑÑ Ñвой код Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑабоÑал в ÑÑÑогой веÑÑии JavaScript, поÑмоÑÑиÑе ÑÑаÑÑÑ ÐеÑеÑ
од к ÑÑÑÐ¾Ð³Ð¾Ð¼Ñ ÑежимÑ
.
СÑÑогий Ñежим пÑименÑеÑÑÑ ÐºÐ¾ вÑÐµÐ¼Ñ ÑкÑипÑÑ Ð¸Ð»Ð¸ к оÑделÑнÑм ÑÑнкÑиÑм. Ðн не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑименÑн к блокам опеÑаÑоÑов, заклÑÑÑннÑÑ
в ÑигÑÑнÑе Ñкобки â попÑÑка иÑполÑзоваÑÑ ÐµÐ³Ð¾ в подобном конÑекÑÑе бÑÐ´ÐµÑ Ð¿ÑоигноÑиÑована. Ðод в eval
, Function
, в аÑÑибÑÑаÑ
обÑабоÑÑиков ÑобÑÑий, в ÑÑÑокаÑ
, пеÑеданнÑÑ
в setTimeout
, и Ñ.п. ÑаÑÑмаÑÑиваеÑÑÑ ÐºÐ°Ðº законÑеннÑй ÑкÑипÑ, и акÑивизаÑÐ¸Ñ ÑÑÑогого Ñежима в нÑм вÑполнÑеÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ñм обÑазом.
ЧÑÐ¾Ð±Ñ Ð°ÐºÑивизиÑоваÑÑ ÑÑÑогий Ñежим Ð´Ð»Ñ Ð²Ñего ÑкÑипÑа, нÑжно помеÑÑиÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ "use strict";
или 'use strict';
пеÑед вÑеми оÑÑалÑнÑми опеÑаÑоÑами ÑкÑипÑа (вÑдеÑжаÑÑ Ð¿ÑиведÑннÑй ÑинÑакÑÐ¸Ñ Ð±ÑквалÑно).
// СинÑакÑÐ¸Ñ Ð¿ÐµÑеклÑÑÐµÐ½Ð¸Ñ Ð² ÑÑÑогий Ñежим вÑего ÑкÑипÑа
"use strict";
var v = "ÐÑивеÑ! Я ÑкÑÐ¸Ð¿Ñ Ð² ÑÑÑогом Ñежиме!";
Ð ÑÑой ÑинÑакÑиÑеÑкой конÑÑÑÑкÑии кÑоеÑÑÑ Ð»Ð¾Ð²ÑÑка, в коÑоÑÑÑ Ñже Ñгодили даже ÑамÑе извеÑÑнÑе ÑайÑÑ: нелÑÐ·Ñ Ð±ÐµÐ·Ð´Ñмно обÑединÑÑÑ ÑкÑипÑÑ Ñ ÑазнÑми Ñежимами. ÐбÑединение ÑкÑипÑа в ÑÑÑогом Ñежиме Ñо ÑкÑипÑом в обÑÑном вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº ÑкÑÐ¸Ð¿Ñ Ð² ÑÑÑогом Ñежиме! СпÑаведливо и обÑаÑное: обÑединение обÑÑного ÑкÑипÑа Ñо ÑÑÑогим вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº неÑÑÑогий ÑкÑипÑ. ÐбÑединение ÑолÑко ÑÑÑÐ¾Ð³Ð¸Ñ Ð¸Ð»Ð¸ ÑолÑко обÑÑнÑÑ ÑкÑипÑов пÑÐ¾Ñ Ð¾Ð´Ð¸Ñ Ð±ÐµÐ· поÑледÑÑвий, пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð²ÑзÑÐ²Ð°ÐµÑ ÑовмеÑÑное иÑполÑзование ÑкÑипÑов Ñо ÑÑÑогим и обÑÑнÑм Ñежимом. ÐоÑÑÐ¾Ð¼Ñ ÑекомендÑеÑÑÑ Ð²ÐºÐ»ÑÑаÑÑ ÑÑÑогий Ñежим ÑолÑко на ÑÑовне ÑÑнкÑий (Ñ Ð¾ÑÑ Ð±Ñ Ð² ÑеÑение пеÑÐµÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ пеÑиода).
ÐÑ Ñакже можеÑе иÑполÑзоваÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ "обÑÑÑÑваниÑ" вÑего ÑодеÑжимого ÑкÑипÑа в ÑÑнкÑиÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑой вклÑÑÑн ÑÑÑогий Ñежим. ÐÑо ÑменÑÑÐ¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¿Ñоблем пÑи обÑединении ÑкÑипÑов, но одновÑеменно поÑÑебÑÐµÑ Ñвно ÑкÑпоÑÑиÑоваÑÑ Ð¸Ð· конÑекÑÑа ÑÑнкÑии вÑе глобалÑнÑе пеÑеменнÑе.
СÑÑогий Ñежим Ð´Ð»Ñ ÑÑнкÑийÐналогиÑно, ÑÑÐ¾Ð±Ñ Ð²ÐºÐ»ÑÑиÑÑ ÑÑÑогий Ñежим Ð´Ð»Ñ ÑÑнкÑии, помеÑÑиÑе опеÑаÑÐ¾Ñ "use strict";
(или 'use strict';
) в Ñело ÑÑнкÑии пеÑед лÑбÑми дÑÑгими опеÑаÑоÑами.
function strict() {
// СÑÑогий Ñежим на ÑÑовне ÑÑнкÑии
"use strict";
function nested() {
return "Ð Ñ Ñоже!";
}
return "ÐÑивеÑ! Я ÑÑнкÑÐ¸Ñ Ð² ÑÑÑогом Ñежиме! " + nested();
}
function notStrict() {
return "Я не strict.";
}
СÑÑогий Ñежим Ð´Ð»Ñ Ð¼Ð¾Ð´Ñлей
ECMAScript 2015 пÑедÑÑавил модÑли JavaScript и, ÑледоваÑелÑно, 3-й ÑпоÑоб войÑи в ÑÑÑогий Ñежим. ÐÑе ÑодеÑжимое модÑлей JavaScript авÑомаÑиÑеÑки Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² ÑÑÑогом Ñежиме, и Ð´Ð»Ñ ÐµÐ³Ð¾ запÑÑка не ÑÑебÑеÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð¸Ð½ÑÑÑÑкÑий.
function strict() { // ÐоÑÐ¾Ð¼Ñ ÑÑо ÑÑо модÑлÑ, Ñ strict по ÑмолÑÐ°Ð½Ð¸Ñ } export default strict;ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑÑогом Ñежиме
СÑÑогий Ñежим изменÑÐµÑ ÑинÑакÑÐ¸Ñ Ð¸ поведение ÑÑÐµÐ´Ñ Ð¸ÑполнениÑ. ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð»Ð°Ð²Ð½Ñм обÑазом попадаÑÑ Ð² ÑледÑÑÑие каÑегоÑии: пÑеобÑазование оÑибок в иÑклÑÑениÑ; изменениÑ, ÑпÑоÑаÑÑие вÑÑиÑление пеÑеменной в опÑеделÑннÑÑ
ÑлÑÑаÑÑ
иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸; изменениÑ, ÑпÑоÑаÑÑие eval
и arguments
; изменениÑ, ÑпÑоÑаÑÑие напиÑание "безопаÑного" JavaScript, и изменениÑ, пÑедвоÑÑ
иÑаÑÑие далÑнейÑее ÑазвиÑие ECMAScript.
СÑÑогий Ñежим пÑевÑаÑÐ°ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе пÑоÑавÑиеÑÑ Ñанее оÑибки в иÑклÑÑениÑ. JavaScript бÑл ÑазÑабоÑан Ñ ÑаÑÑÑÑом на низкий поÑог Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ, и вÑеменами он пÑидаÑÑ Ð·Ð°Ð²ÐµÐ´Ð¾Ð¼Ð¾ оÑибоÑнÑм опеÑаÑиÑм ÑеманÑÐ¸ÐºÑ Ð½Ð¾ÑмалÑного кода. Ðногда ÑÑо Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ ÑÑоÑно ÑеÑиÑÑ Ð¿ÑоблемÑ, а иногда ÑÑо ÑоздаÑÑ Ñ ÑдÑие пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð² бÑдÑÑем. СÑÑогий Ñежим ÑаÑÑÐµÐ½Ð¸Ð²Ð°ÐµÑ Ñакие оÑибки как оÑибки вÑемени вÑполнениÑ, Ð´Ð»Ñ Ñого ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ могли бÑÑÑ Ð¾Ð±Ð½Ð°ÑÑÐ¶ÐµÐ½Ñ Ð¸ иÑпÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² обÑзаÑелÑном поÑÑдке.
Ðо-пеÑвÑÑ , ÑÑÑогий Ñежим Ð´ÐµÐ»Ð°ÐµÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм ÑлÑÑайное Ñоздание глобалÑнÑÑ Ð¿ÐµÑеменнÑÑ . РобÑÑном JavaScript опеÑаÑка в имени пеÑеменной во вÑÐµÐ¼Ñ Ð¿ÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿ÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑвойÑÑва глобалÑного обÑекÑа, и вÑполнение пÑодолжаеÑÑÑ (Ñ Ð¾ÑÑ Ð² ÑовÑеменном JavaScript оно, веÑоÑÑно, аваÑийно завеÑÑиÑÑÑ Ð² далÑнейÑем). ÐÑиÑваиваниÑ, коÑоÑÑе могÑÑ ÑлÑÑайно ÑоздаÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ð¿ÐµÑеменнÑÑ, в ÑÑÑогом Ñежиме вÑбÑаÑÑваÑÑ Ð¸ÑклÑÑение:
"use strict";
// ÐÑедполагаÑ, ÑÑо не ÑÑÑеÑÑвÑÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñной пеÑеменной
mistypeVaraible = 17; // mistypedVaraible, ÑÑа ÑÑÑока вÑбÑоÑÐ¸Ñ ReferenceError
// из-за опеÑаÑки в имени пеÑеменной
Ðо-вÑоÑÑÑ
, ÑÑÑогий Ñежим заÑÑавлÑÐµÑ Ð¿ÑиÑваиваниÑ, коÑоÑÑе вÑÑ Ñавно завеÑÑилиÑÑ Ð±Ñ Ð½ÐµÑдаÑей, вÑбÑаÑÑваÑÑ Ð¸ÑклÑÑениÑ. ÐапÑимеÑ, NaN
â глобалÑÐ½Ð°Ñ Ð¿ÐµÑеменнаÑ, заÑиÑÑÐ½Ð½Ð°Ñ Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñи. РобÑÑном Ñежиме пÑиÑваивание NaN
знаÑÐµÐ½Ð¸Ñ Ð½Ð¸Ñего не делаеÑ; ÑазÑабоÑÑик не полÑÑÐ°ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке. Ð ÑÑÑогом Ñежиме пÑиÑваивание NaN
знаÑÐµÐ½Ð¸Ñ Ð²ÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение. ÐÑбое пÑиÑваивание, коÑоÑое в обÑÑном Ñежиме завеÑÑаеÑÑÑ Ð½ÐµÑдаÑей (пÑиÑваивание знаÑÐµÐ½Ð¸Ñ ÑвойÑÑвÑ, заÑиÑÑÐ½Ð½Ð¾Ð¼Ñ Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñи; пÑиÑваивание знаÑÐµÐ½Ð¸Ñ ÑвойÑÑвÑ, доÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑолÑко на ÑÑение; пÑиÑваивание нового ÑвойÑÑва неÑаÑÑиÑÑÐµÐ¼Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ), в ÑÑÑогом Ñежиме вÑбÑоÑÐ¸Ñ Ð¸ÑклÑÑение:
"use strict";
// ÐÑиÑваивание знаÑÐµÐ½Ð¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»Ñной пеÑеменной, заÑиÑÑнной Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñи
var undefined = 5; // вÑдаÑÑ TypeError
var Infinity = 5; // вÑдаÑÑ TypeError
// ÐÑиÑваивание знаÑÐµÐ½Ð¸Ñ ÑвойÑÑвÑ, заÑиÑÑÐ½Ð½Ð¾Ð¼Ñ Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñи
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // вÑдаÑÑ TypeError
// ÐÑиÑваивание знаÑÐµÐ½Ð¸Ñ ÑвойÑÑвÑ, доÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ
var obj2 = {
get x() {
return 17;
},
};
obj2.x = 5; // вÑдаÑÑ TypeError
// Ðадание нового ÑвойÑÑва неÑаÑÑиÑÑÐµÐ¼Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // вÑдаÑÑ TypeError
Ð-ÑÑеÑÑÐ¸Ñ , в ÑÑÑогом Ñежиме попÑÑки ÑдалиÑÑ Ð½ÐµÑдалÑемÑе ÑвойÑÑва бÑдÑÑ Ð²ÑзÑваÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ (в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº пÑежде ÑÐ°ÐºÐ°Ñ Ð¿Ð¾Ð¿ÑÑка пÑоÑÑо не имела Ð±Ñ ÑÑÑекÑа):
"use strict";
delete Object.prototype; // вÑдаÑÑ TypeError
Ð-ÑеÑвÑÑÑÑÑ , ÑÑÑогий Ñежим ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ Ð²Ñе ÑвойÑÑва, пеÑеÑиÑленнÑе в ÑеÑиализованном обÑекÑе, вÑÑÑеÑалиÑÑ ÑолÑко один Ñаз. РобÑÑном коде имена ÑвойÑÑв могÑÑ Ð´ÑблиÑоваÑÑÑÑ, а знаÑение ÑвойÑÑва опÑеделÑеÑÑÑ Ð¿Ð¾Ñледним обÑÑвлением. Ðо, в Ñаком ÑлÑÑае, дÑблиÑование â пÑоÑÑо поÑва Ð´Ð»Ñ Ð±Ð°Ð³Ð¾Ð², еÑли код ÑедакÑиÑÑеÑÑÑ Ñ Ñем, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑ Ð·Ð½Ð°Ñение ÑвойÑÑва как-Ñо по-дÑÑгомÑ, кÑоме Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледнего обÑÑвлениÑ. ÐÑблиÑование имÑн ÑвойÑÑв в ÑÑÑогом Ñежиме ÑвлÑеÑÑÑ ÑинÑакÑиÑеÑкой оÑибкой:
ÐÑимеÑание: ÐÑо Ñже не ÑвлÑеÑÑÑ Ð¿Ñоблемой в ECMAScript 2015 (Firefox bug 1041128).
"use strict";
var o = { p: 1, p: 2 }; // !!! ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка
Ð-пÑÑÑÑ
, ÑÑÑогий Ñежим ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð¼ÐµÐ½Ð° аÑгÑменÑов в обÑÑвлении ÑÑнкÑий вÑÑÑеÑалиÑÑ ÑолÑко один Ñаз. РобÑÑном коде поÑледний повÑоÑÑннÑй аÑгÑÐ¼ÐµÐ½Ñ ÑкÑÑÐ²Ð°ÐµÑ Ð¿ÑедÑдÑÑие аÑгÑменÑÑ Ñ Ñаким же именем. ÐÑи пÑедÑдÑÑие аÑгÑменÑÑ Ð²ÑÑ ÐµÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ ÑеÑез arguments[i]
, Ñак ÑÑо они не полноÑÑÑÑ Ð¿Ð¾ÑеÑÑнÑ. Тем не менее, Ñакое ÑокÑÑÑие неÑÑÑ Ð² Ñебе мало ÑмÑÑла и, ÑкоÑее вÑего, не Ð¸Ð¼ÐµÐµÑ Ð¿Ð¾Ð´ Ñобой Ñели (напÑимеÑ, Ð¼Ð¾Ð¶ÐµÑ ÑкÑÑваÑÑ Ð¾Ð¿ÐµÑаÑкÑ), поÑÑÐ¾Ð¼Ñ Ð² ÑÑÑогом Ñежиме дÑблиÑование имÑн аÑгÑменÑов ÑвлÑеÑÑÑ ÑинÑакÑиÑеÑкой оÑибкой:
function sum(a, a, c) {
// !!! ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка
"use strict";
return a + a + c; // оÑибка, еÑли код бÑл запÑÑен
}
Ð-ÑеÑÑÑÑ
, ÑÑÑогий Ñежим запÑеÑÐ°ÐµÑ ÑинÑакÑÐ¸Ñ Ð²Ð¾ÑÑмеÑиÑной ÑиÑÑÐµÐ¼Ñ ÑÑиÑлениÑ. ÐоÑÑмеÑиÑнÑй ÑинÑакÑÐ¸Ñ Ð½Ðµ ÑвлÑеÑÑÑ ÑаÑÑÑÑ ECMAScript, но поддеÑживаеÑÑÑ Ð²Ð¾ вÑеÑ
бÑаÑзеÑаÑ
Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´Ð¾Ð¿Ð¸ÑÑÐ²Ð°Ð½Ð¸Ñ Ð½ÑÐ»Ñ ÑпеÑеди к воÑÑмеÑиÑÐ½Ð¾Ð¼Ñ ÑиÑлÑ: 0644 === 420
и "\045" === "%"
. Ð ECMAScript 2015 воÑÑмеÑиÑное ÑиÑло поддеÑживаеÑÑÑ Ñакже Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´Ð¾Ð¿Ð¸ÑÑÐ²Ð°Ð½Ð¸Ñ Ð¿ÐµÑед ÑиÑлом "0o
". Т.е.
var a = 0o10; // ES2015: ÐоÑмеÑиÑное
Ðногда наÑинаÑÑие ÑазÑабоÑÑики дÑмаÑÑ, ÑÑо ведÑÑий Ð½Ð¾Ð»Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ ÑеманÑиÑеÑкого знаÑениÑ, и иÑполÑзÑÑÑ ÐµÐ³Ð¾ Ð´Ð»Ñ Ð²ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ â но ÑÑо менÑÐµÑ Ð·Ð½Ð°Ñение ÑиÑла! ÐоÑÑмеÑиÑнÑй ÑинÑакÑÐ¸Ñ Ñедко бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ¿ÑавилÑно иÑполÑзован, поÑÑÐ¾Ð¼Ñ ÑÑÑогий Ñежим ÑÑиÑÐ°ÐµÑ Ð²Ð¾ÑÑмеÑиÑнÑе ÑиÑла ÑинÑакÑиÑеÑкой оÑибкой:
"use strict";
var sum =
015 + // !!! ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка
197 +
142;
var sumWithOctal = 0o10 + 8;
console.log(sumWithOctal); // 16
Ð-ÑедÑмÑÑ
, ÑÑÑогий Ñежим в ECMAScript 2015 запÑеÑÐ°ÐµÑ ÑÑÑÐ°Ð½Ð¾Ð²ÐºÑ ÑвойÑÑв primitive знаÑениÑм. Ðез ÑÑÑогого Ñежима, ÑÑÑановка ÑвойÑÑв пÑоÑÑо игноÑиÑÑеÑÑÑ (no-op), Ñо ÑÑÑогим Ñежимом, однако, вÑдаÑÑ TypeError
.
(function() { 'use strict'; false.true = ''; // TypeError (14).sailing = 'home'; // TypeError 'with'.you = 'far away'; // TypeError })();УпÑоÑение ÑабоÑÑ Ñ Ð¿ÐµÑеменнÑми
СÑÑогий Ñежим ÑпÑоÑÐ°ÐµÑ ÑопоÑÑавление имени пеÑеменной Ñ Ð¼ÐµÑÑом ÐµÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² коде. Ðногие опÑимизаÑии вÑемени компилÑÑии полагаÑÑÑÑ Ð½Ð° возможноÑÑÑ ÑÑиÑаÑÑ, ÑÑо пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ X Ñ ÑаниÑÑÑ Ð² ÑÑом конкÑеÑном меÑÑе иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кода. Ðногда, пÑи компилÑÑии JavaScript пÑоÑÑое ÑопоÑÑавление имени пеÑеменной Ñ Ð¼ÐµÑÑом ÐµÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² коде не возможно, без вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñого Ñамого кода. СÑÑогий же Ñежим иÑклÑÑÐ°ÐµÑ Ð±Ð¾Ð»ÑÑинÑÑво ÑÐ°ÐºÐ¸Ñ ÑлÑÑаев, благодаÑÑ ÑÐµÐ¼Ñ Ð¾Ð¿ÑимизаÑии компилÑÑоÑа ÑабоÑаÑÑ ÑÑÑекÑивнее.
Ðо-пеÑвÑÑ
, ÑÑÑогий Ñежим запÑеÑÐ°ÐµÑ Ð¸ÑполÑзование with
. ÐÑоблема Ñ with
в Ñом, ÑÑо во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð»Ñбое Ð¸Ð¼Ñ Ð²Ð½ÑÑÑи блока Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ ÐºÐ°Ðº на ÑвойÑÑво обÑабаÑÑваемого обÑекÑа, Ñак и на пеÑеменнÑÑ Ð² окÑÑжаÑÑем (или даже в глобалÑном) конÑекÑÑе â невозможно знаÑÑ Ð¾Ð± ÑÑом заÑанее. СÑÑогий Ñежим ÑÑиÑÐ°ÐµÑ with
ÑинÑакÑиÑеÑкой оÑибкой, поÑÑÐ¾Ð¼Ñ Ð½Ðµ оÑÑаÑÑÑÑ ÑанÑа иÑполÑзоваÑÑ Ð¸Ð¼Ñ Ð¿ÐµÑеменной внÑÑÑи with
Ð´Ð»Ñ ÑÑÑлки на неизвеÑÑное меÑÑо во вÑÐµÐ¼Ñ Ð²ÑполнениÑ:
"use strict";
var x = 17;
with (obj) {
// !!! ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка
// ÐÑли код не в ÑÑÑогом Ñежиме, Ñо бÑÐ´ÐµÑ Ð»Ð¸ x ÑÑÑлаÑÑÑÑ Ð½Ð° пеÑеменнÑÑ var x, или
// на ÑвойÑÑво obj.x? ÐÑедÑгадаÑÑ Ð±ÐµÐ· запÑÑка кода невозможно,
// ÑледоваÑелÑно Ñакой код не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑекÑивно опÑимизиÑован.
x;
}
ÐÑоÑÑÐ°Ñ Ð°Ð»ÑÑеÑнаÑива with
Ñже ÑÑÑеÑÑвÑÐµÑ â пÑиÑваивание обÑекÑа пеÑеменной Ñ ÐºÐ¾ÑоÑким именем и заÑем доÑÑÑп к нÑÐ¶Ð½Ð¾Ð¼Ñ ÑвойÑÑÐ²Ñ ÐºÐ°Ðº ÑвойÑÑÐ²Ñ ÑÑой пеÑеменной.
Ðо-вÑоÑÑÑ
, eval
в ÑÑÑогом Ñежиме не добавлÑÐµÑ Ð½Ð¾Ð²ÑÑ
пеÑеменнÑÑ
в окÑÑжаÑÑий конÑекÑÑ. РобÑÑном Ñежиме, пÑи вÑзове eval("var x;")
пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ x
добавиÑÑÑ Ð² облаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи окÑÑжаÑÑей ÑÑнкÑии либо в глобалÑнÑй конÑекÑÑ. РобÑем ÑлÑÑае, ÑÑо ознаÑаеÑ, ÑÑо в каждой ÑÑнкÑии, в коÑоÑой пÑиÑÑÑÑÑвÑÐµÑ Ð²Ñзов eval
, имена пеÑеменнÑÑ
коÑоÑÑе не ÑÑÑлаÑÑÑÑ Ð½Ð° аÑгÑÐ¼ÐµÐ½Ñ Ð¸Ð»Ð¸ локалÑнÑÑ Ð¿ÐµÑеменнÑÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑопоÑÑавлÑÑÑÑÑ Ñ Ð¼ÐµÑÑом иÑ
опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² коде ÑолÑко во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (поÑÐ¾Ð¼Ñ ÑÑо eval
мог ввеÑÑи новÑÑ Ð¿ÐµÑеменнÑÑ, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑекÑÑÑÑ Ð²Ð½ÐµÑнÑÑ Ð¿ÐµÑеменнÑÑ). Ð ÑÑÑогом Ñежиме eval
ÑоздаÑÑ Ð¿ÐµÑеменнÑе ÑолÑко в конÑекÑÑе вÑполнÑемого кода, Ñак ÑÑо eval
не Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²Ð»Ð¸ÑÑÑ Ð½Ð° Ñо, ÑÑÑлаеÑÑÑ Ð»Ð¸ Ð¸Ð¼Ñ Ð½Ð° локалÑнÑÑ Ð¸Ð»Ð¸ на внеÑнÑÑ Ð¿ÐµÑеменнÑÑ:
var x = 17;
var evalX = eval("'use strict'; var x = 42; x");
console.assert(x === 17);
console.assert(evalX === 42);
СооÑвеÑÑÑвенно, еÑли ÑÑнкÑÐ¸Ñ eval
вÑзвана непоÑÑедÑÑвенно в ÑоÑме вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ eval(...)
, Ñо внÑÑÑи кода в ÑÑÑогом Ñежиме, пеÑедаваемÑй в Ð½ÐµÑ ÐºÐ¾Ð´ бÑÐ´ÐµÑ Ð²Ñполнен в ÑÑÑогом Ñежиме. ÐеÑедаваемÑй код Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð² Ñебе вклÑÑение ÑÑÑогого Ñежима, но в ÑÑом Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи.
function strict1(str) {
"use strict";
return eval(str); // str бÑÐ´ÐµÑ Ð²Ñполнен как код ÑÑÑогого Ñежима
}
function strict2(f, str) {
"use strict";
return f(str); // не eval(...): str вÑполниÑÑÑ Ð² ÑÑÑогом Ñежиме ÑолÑко в Ñом
// ÑлÑÑае, еÑли в нем ÑодеÑжиÑÑÑ Ð²Ñзов ÑÑÑогого Ñежима
}
function nonstrict(str) {
return eval(str); // str вÑполниÑÑÑ Ð² ÑÑÑогом Ñежиме ÑолÑко в Ñом
// ÑлÑÑае, еÑли в нем ÑодеÑжиÑÑÑ Ð²Ñзов ÑÑÑогого Ñежима
}
strict1("'СÑÑогий Ñежим!'");
strict1("'use strict'; 'СÑÑогий Ñежим!'");
strict2(eval, "'Ðе ÑÑÑогий Ñежим.'");
strict2(eval, "'use strict'; 'СÑÑогий Ñежим!'");
nonstrict("'Ðе ÑÑÑогий Ñежим.'");
nonstrict("'use strict'; 'СÑÑогий Ñежим!'");
Таким обÑазом, имена в ÑÑÑогом коде, пеÑедаваемом в eval
, ведÑÑ ÑÐµÐ±Ñ Ñак же, как имена в неÑÑÑогом коде, пеÑедаваемом в eval
внÑÑÑи ÑÑÑогого Ñежима.
Ð-ÑÑеÑÑиÑ
, ÑÑÑогий Ñежим запÑеÑÐ°ÐµÑ Ñдаление пÑоÑÑÑÑ
имÑн. delete name
в ÑÑÑогом Ñежиме ÑвлÑеÑÑÑ ÑинÑакÑиÑеÑкой оÑибкой:
"use strict";
var x;
delete x; // !!! ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка
eval("var y; delete y;"); // !!! ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка
УпÑоÑение eval
и arguments
Ð ÑÑÑогом Ñежиме ÑнижаеÑÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑÑÑанноÑÑей в поведении arguments
и eval
, оба из коÑоÑÑÑ
пÑимеÑиваÑÑ Ð¾Ð¿ÑеделÑнное колиÑеÑÑво магии в обÑÑнÑй код. Так eval
добавлÑÐµÑ Ð¸Ð»Ð¸ ÑдалÑÐµÑ Ð¿ÐµÑеменнÑе и менÑÐµÑ Ð¸Ñ
знаÑениÑ, а пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ arguments
Ð¼Ð¾Ð¶ÐµÑ ÑдивиÑÑ Ñвоими пÑоиндекÑиÑованнÑми ÑвойÑÑвами, коÑоÑÑе ÑвлÑÑÑÑÑ ÑÑÑлками (Ñинонимами) Ð´Ð»Ñ Ð¿Ð¾Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½ÑÑ
аÑгÑменÑов ÑÑнкÑии. СÑÑогий Ñежим Ð´ÐµÐ»Ð°ÐµÑ Ð±Ð¾Ð»ÑÑой Ñаг в пÑоÑÑнении ÑÑиÑ
двÑÑ
клÑÑевÑÑ
Ñлов, но полное иÑ
обÑздание пÑоизойдÑÑ Ð»Ð¸ÑÑ Ð² ÑледÑÑÑей ÑедакÑии ECMAScript.
Ðо-пеÑвÑÑ
, клÑÑевÑе Ñлова eval
и arguments
не могÑÑ Ð±ÑÑÑ Ð¿ÐµÑеопÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¸Ð»Ð¸ измененÑ. ÐÑе подобнÑе попÑÑки ÑÑо ÑделаÑÑ ÑвлÑÑÑÑÑ ÑинÑакÑиÑеÑкими оÑибками:
"use strict";
eval = 17;
arguments++;
++eval;
var obj = { set p(arguments) {} };
var eval;
try {
} catch (arguments) {}
function x(eval) {}
function arguments() {}
var y = function eval() {};
var f = new Function("arguments", "'use strict'; return 17;");
Ðо-вÑоÑÑÑ
, в ÑÑÑогом Ñежиме Ð¿Ð¾Ð»Ñ Ð¾Ð±ÑекÑа arguments
не ÑвÑÐ·Ð°Ð½Ñ Ñ Ð¿ÑоименованнÑми аÑгÑменÑами ÑÑнкÑии, а ÑвлÑÑÑÑÑ Ð¸Ñ
пÑодÑблиÑованнÑми копиÑми знаÑений. РобÑÑном коде внÑÑÑи ÑÑнкÑии, пеÑвÑм аÑгÑменÑом коÑоÑой ÑвлÑеÑÑÑ arg
, изменение знаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеменной arg
Ñакже менÑÐµÑ Ð·Ð½Ð°Ñение и Ñ Ð¿Ð¾Ð»Ñ arguments[0]
, и наобоÑÐ¾Ñ (кÑоме ÑлÑÑаев, когда аÑгÑÐ¼ÐµÐ½Ñ Ð² ÑÑнкÑÐ¸Ñ Ð½Ðµ пеÑедан, или arguments[0]
ÑдалÑн). Ð ÑÑÑогом Ñежиме arguments
Ñ
ÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸ знаÑений аÑгÑменÑов пеÑеданнÑÑ
пÑи вÑзове ÑÑнкÑии. arguments[i]
не оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÑооÑвеÑÑÑвÑÑÑего именованного аÑгÑменÑа, и именованнÑй аÑгÑÐ¼ÐµÐ½Ñ Ð½Ðµ оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÑ Ð·Ð½Ð°Ñение ÑооÑвеÑÑÑвÑÑÑего arguments[i].
function f(a) {
"use strict";
a = 42;
return [a, arguments[0]];
}
var pair = f(17);
console.assert(pair[0] === 42);
console.assert(pair[1] === 17);
Ð-ÑÑеÑÑиÑ
, ÑвойÑÑво arguments.callee
болÑÑе не поддеÑживаеÑÑÑ. РобÑÑном коде ÑвойÑÑво arguments.callee
ÑÑÑлаеÑÑÑ Ð½Ð° ÑÐ°Ð¼Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð²Ñзова коÑоÑой и бÑл Ñоздан обÑÐµÐºÑ arguments
. ÐалопÑименимое ÑвойÑÑво, Ñак как ÑÑнкÑÐ¸Ñ Ð·Ð°Ñанее извеÑÑна, и к ней можно обÑаÑиÑÑÑÑ Ð¸ по ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸ непоÑÑедÑÑвенно. Ðолее Ñого, arguments.callee
знаÑиÑелÑно заÑÑÑднÑÐµÑ ÑакÑÑ Ð¾Ð¿ÑимизаÑиÑ, как инлайнинг, поÑÐ¾Ð¼Ñ ÐºÐ°Ðº должна бÑÑÑ ÑоÑ
Ñанена возможноÑÑÑ Ð¾Ð±ÑаÑиÑÑÑÑ Ðº незаинлайненой ÑÑнкÑии на ÑлÑÑай, еÑли пÑиÑÑÑÑÑвÑÐµÑ Ð¾Ð±ÑаÑение к arguments.callee. Ð ÑÑÑогом Ñежиме arguments.callee пÑевÑаÑаеÑÑÑ Ð² неÑдалÑемое ÑвойÑÑво, коÑоÑое вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¿ÑедоÑÑеÑегаÑÑее иÑклÑÑение пÑи лÑбой попÑÑке обÑаÑÐµÐ½Ð¸Ñ Ðº немÑ:
"use strict";
var f = function () {
return arguments.callee;
};
f(); // вÑдаÑÑ TypeError
"ÐезопаÑнÑй" JavaScript
СÑÑогий Ñежим ÑпÑоÑÐ°ÐµÑ Ð½Ð°Ð¿Ð¸Ñание "безопаÑного" JavaScript-кода. СейÑÐ°Ñ Ð½ÐµÐºÐ¾ÑоÑÑе веб-ÑайÑÑ Ð¿ÑедоÑÑавлÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑм возможноÑÑÑ Ð¿Ð¸ÑаÑÑ JavaScript, коÑоÑÑй бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð½Ð° ÑайÑе Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ дÑÑÐ³Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелей. РбÑаÑзеÑÐ°Ñ , JavaScript Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð´Ð¾ÑÑÑп к пÑиваÑной инÑоÑмаÑии полÑзоваÑелÑ, поÑÑомÑ, в ÑелÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа к запÑеÑной ÑÑнкÑионалÑноÑÑи, Ñакой JavaScript пеÑед вÑполнением должен бÑÑÑ ÑаÑÑиÑно пÑеобÑазован. ÐибкоÑÑÑ JavaScript Ð´ÐµÐ»Ð°ÐµÑ ÑÑо пÑакÑиÑеÑки невозможнÑм без многоÑиÑленнÑÑ Ð¿ÑовеÑок во вÑÐµÐ¼Ñ Ð¸ÑполнениÑ. ФÑнкÑионал, иÑполнÑемÑй ÑзÑком иногда ÑÑÐ¾Ð»Ñ Ð¼Ð°ÑÑивен, ÑÑо вÑполнение лÑбÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¿ÑовеÑок во вÑÐµÐ¼Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑкÑипÑа пÑиведÑÑ Ðº знаÑиÑелÑной поÑеÑе пÑоизводиÑелÑноÑÑи. Ðднако, некоÑоÑÑе оÑобенноÑÑи ÑÑÑогого Ñежима, плÑÑ Ð¾Ð±ÑзаÑелÑное ÑÑебование Ñого, ÑÑÐ¾Ð±Ñ JavaScript, загÑÑженнÑй полÑзоваÑелем, имел ÑÑÑогий Ñежим и вÑзÑвалÑÑ Ð¾Ð¿ÑеделÑннÑм ÑпоÑобом, ÑÑÑеÑÑвенно ÑнижаÑÑ Ð¿Ð¾ÑÑебноÑÑÑ Ð² ÑÐ°ÐºÐ¸Ñ Ð¿ÑовеÑÐºÐ°Ñ .
Ðо-пеÑвÑÑ
, знаÑение, пеÑедаваемое в ÑÑнкÑÐ¸Ñ ÐºÐ°Ðº this
, в ÑÑÑогом Ñежиме не пÑиводиÑÑÑ Ðº обÑекÑÑ (не "ÑпаковÑваеÑÑÑ"). РобÑÑной ÑÑнкÑии this
вÑегда пÑедÑÑавлÑÐµÑ Ñобой обÑекÑ: либо ÑÑо непоÑÑедÑÑвенно обÑекÑ, в ÑлÑÑае вÑзова Ñ this
, пÑедÑÑавлÑÑÑим обÑекÑ-знаÑение; либо знаÑение, Ñпакованное в обÑекÑ, в ÑлÑÑае вÑзова Ñ this
Ñипа Boolean, string, или number; либо глобалÑнÑй обÑекÑ, еÑли Ñип this
ÑÑо undefined
или null
. (ÐÐ»Ñ ÑоÑного опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑного this
иÑполÑзÑйÑе
, call
, или apply
.) ÐвÑомаÑиÑеÑÐºÐ°Ñ Ñпаковка не ÑолÑко ÑÐ½Ð¸Ð¶Ð°ÐµÑ Ð¿ÑоизводиÑелÑноÑÑÑ, но и вÑÑÑавлÑÐµÑ Ð½Ð° показ глобалÑнÑй обÑекÑ, ÑÑо в бÑаÑзеÑаÑ
ÑвлÑеÑÑÑ ÑгÑозой безопаÑноÑÑи, поÑÐ¾Ð¼Ñ ÑÑо глобалÑнÑй обÑÐµÐºÑ Ð¿ÑедоÑÑавлÑÐµÑ Ð´Ð¾ÑÑÑп к ÑÑнкÑионалÑноÑÑи, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð¾Ð³ÑаниÑена в ÑÑеде "безопаÑного" JavaScript. Таким обÑазом, Ð´Ð»Ñ ÑÑнкÑии в ÑÑÑогом Ñежиме ÑоÑно опÑеделÑннÑй bind
this
не ÑпаковÑваеÑÑÑ Ð² обÑекÑ, а еÑли не опÑеделÑн ÑоÑно, this
ÑвлÑеÑÑÑ undefined
:
"use strict";
function fun() {
return this;
}
console.assert(fun() === undefined);
console.assert(fun.call(2) === 2);
console.assert(fun.apply(null) === null);
console.assert(fun.call(undefined) === undefined);
console.assert(fun.bind(true)() === true);
Ðо-вÑоÑÑÑ
, в ÑÑÑогом Ñежиме болÑÑе не пÑедÑÑавлÑеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм оÑÑÑеÑÑвлÑÑÑ "пÑогонкÑ" ÑÑека JavaScript поÑÑедÑÑвом базовÑÑ
ÑаÑÑиÑений ECMAScript. РобÑÑном коде, иÑполÑзÑÑÑем ÑÑи ÑаÑÑиÑениÑ, когда ÑÑнкÑÐ¸Ñ fun
наÑ
одиÑÑÑ Ð² пÑоÑеÑÑе Ñвоего вÑзова, fun.caller
пÑедÑÑавлÑÐµÑ Ñобой ÑÑнкÑиÑ, вÑзвавÑÑÑ fun
, а fun.arguments
ÑÑо аÑгÑменÑÑ
Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ вÑзова fun
. Ðба ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑвлÑÑÑÑÑ Ð¿ÑоблемнÑми Ð´Ð»Ñ "безопаÑного" JavaScript, Ñак как они позволÑÑÑ "безопаÑномÑ" ÐºÐ¾Ð´Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к "пÑивилегиÑованнÑм" ÑÑнкÑиÑм и иÑ
(поÑенÑиалÑно небезопаÑнÑм) аÑгÑменÑам. ÐÑли fun
наÑ
одиÑÑÑ Ð² ÑÑÑогом Ñежиме, Ñо fun.caller
, Ñак же как и fun.arguments,
пÑедÑÑавлÑÑÑ Ñобой неÑдалÑемÑе ÑвойÑÑва, коÑоÑÑе пÑиведÑÑ Ðº вÑÐ·Ð¾Ð²Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ñи попÑÑке иÑ
ÑÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ запиÑи:
function restricted() {
"use strict";
restricted.caller; // вÑдаÑÑ TypeError
restricted.arguments; // вÑдаÑÑ TypeError
}
function privilegedInvoker() {
return restricted();
}
privilegedInvoker();
Ð-ÑÑеÑÑиÑ
, в ÑÑнкÑиÑÑ
ÑÑÑогого Ñежима ÑвойÑÑво arguments
болÑÑе не пÑедоÑÑавлÑÐµÑ Ð´Ð¾ÑÑÑп к пеÑеменнÑм, ÑозданнÑм внÑÑÑи ÑÑнкÑии. РнекоÑоÑÑÑ
пÑедÑдÑÑиÑ
ÑеализаÑиÑÑ
ECMAScript arguments.caller
пÑедÑÑавлÑл Ñобой обÑекÑ, ÑвойÑÑва коÑоÑого ÑвлÑлиÑÑ ÑÑÑлками на пеÑеменнÑе, ÑозданнÑе внÑÑÑи ÑÑнкÑии пÑи ÐµÑ Ð²Ñзове. ÐÑо пÑедÑÑавлÑÐµÑ Ñобой ÑгÑÐ¾Ð·Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи, Ñак как наÑÑÑÐ°ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑкÑÑваÑÑ Ð¿ÑиваÑнÑе даннÑе внÑÑÑи ÑÑнкÑий (замÑканий). Также ÑÑо Ð´ÐµÐ»Ð°ÐµÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñми болÑÑинÑÑво опÑимизаÑий. ÐÑÑ
Ð¾Ð´Ñ Ð¸Ð· ÑÑиÑ
пÑиÑин, ни один из ÑовÑеменнÑÑ
бÑаÑзеÑов не ÑеализÑÐµÑ ÑÑого поведениÑ. Ðо вÑÑ Ð¶Ðµ, Ð²Ð²Ð¸Ð´Ñ Ñвоей иÑÑоÑиÑеÑкой ÑÑнкÑионалÑноÑÑи, arguments.caller
Ð´Ð»Ñ ÑÑнкÑий в ÑÑÑогом Ñежиме вÑÑ ÐµÑÑ ÑвлÑеÑÑÑ Ð½ÐµÑдалÑемÑм ÑвойÑÑвом, коÑоÑое вÑзÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение пÑи попÑÑке его ÑÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ запиÑи:
"use strict";
function fun(a, b) {
"use strict";
var v = 12;
return arguments.caller; // вÑдаÑÑ TypeError
}
fun(1, 2); // не вÑÐ²Ð¾Ð´Ð¸Ñ v (или a, или b)
ÐодгоÑовка поÑÐ²Ñ Ð´Ð»Ñ Ð±ÑдÑÑиÑ
веÑÑий ECMAScript
РбÑдÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ ECMAScript Ñ Ð²ÑÑокой веÑоÑÑноÑÑÑÑ Ð¿Ð¾ÑвиÑÑÑ Ð½Ð¾Ð²Ñй ÑинÑакÑиÑ, и Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð° на новÑе веÑÑии, в ÑÑÑогом Ñежиме ECMAScript 5 введено неÑколÑко огÑаниÑений. ÐÑегда пÑоÑе вноÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑандаÑÑ, еÑли заÑанее подгоÑовиÑÑ Ð´Ð»Ñ Ð½Ð¸Ñ Ð¾ÑÐ½Ð¾Ð²Ñ Ð² ÑÑÑогом Ñежиме.
Ðо-пеÑвÑÑ
, в ÑÑÑогом Ñежиме заÑезеÑвиÑован Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑледÑÑÑий ÑпиÑок клÑÑевÑÑ
Ñлов: implements
, interface
, let
, package
, private
, protected
, public
, static
и yield
. Ð ÑÑÑогом Ñежиме, ÑледоваÑелÑно, Ð²Ñ Ð½Ðµ можеÑе задейÑÑвоваÑÑ ÑÑи Ñлова Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ обÑаÑÐµÐ½Ð¸Ñ Ðº пеÑеменнÑм или аÑгÑменÑам.
function package(protected) {
// !!!
"use strict";
var implements; // !!!
// !!!
interface: while (true) {
break interface; // !!!
}
function private() {} // !!!
}
function fun(static) {
"use strict";
} // !!!
Ðва замеÑаниÑ, ÑпеÑиÑиÑнÑÑ
Ð´Ð»Ñ Mozilla: ÐеÑвое, еÑли Ð²Ð°Ñ ÐºÐ¾Ð´ Ñоздан на JavaScript 1.7 или вÑÑе (напÑимеÑ, chrome code, или Ñег <script type="">
заполнен пÑавилÑно), и пÑименÑн ÑÑÑогий Ñежим, Ñо let
и yield
имеÑÑ ÑÑ Ð¶Ðµ ÑÑнкÑионалÑноÑÑÑ, коÑоÑÐ°Ñ Ñ Ð½Ð¸Ñ
бÑла изнаÑалÑно, когда они ÑолÑко поÑвилиÑÑ. Ðднако в веб, в ÑÑÑогом коде загÑÑженном ÑеÑез <script src="">
или <script>...</script>
, нелÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ let
/yield
в каÑеÑÑве иденÑиÑикаÑоÑов. ÐÑоÑое, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ES5 заÑезеÑвиÑовал Ñлова class
, enum
, export
, extends
, import
и super
Ð´Ð»Ñ Ð»Ñбого Ñежима, в Firefox 5 Mozilla они бÑли заÑезеÑвиÑÐ¾Ð²Ð°Ð½Ñ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ ÑанÑÑе и лиÑÑ Ð´Ð»Ñ ÑÑÑогого Ñежима.
Ðо-вÑоÑÑÑ , в ÑÑÑогом Ñежиме запÑеÑаеÑÑÑ Ð¾Ð±ÑÑвление ÑÑнкÑий глÑбже Ñамого веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ ÑкÑипÑа или ÑÑнкÑии. РобÑÑном коде в бÑаÑзеÑÐ°Ñ , обÑÑвление ÑÑнкÑий позволено "везде", ÑÑо не ÑвлÑеÑÑÑ ÑаÑÑÑÑ ES5 (или даже ES3!) ÐÑо ÑаÑÑиÑение ÑазлиÑнÑÑ Ð±ÑаÑзеÑов, не имеÑÑее обÑего ÑовмеÑÑимого Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð°. ÐÑÑÑ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°, ÑÑо в поÑледÑÑÑÐ¸Ñ ÑедакÑиÑÑ ECMAScript бÑÐ´ÐµÑ Ð¾Ð¿Ñеделена Ð½Ð¾Ð²Ð°Ñ ÑеманÑика Ð´Ð»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑÑнкÑий вне веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ ÑкÑипÑа или ÑÑнкÑии. ÐапÑÐµÑ Ð½Ð° обÑÑвление ÑÐ°ÐºÐ¸Ñ ÑÑнкÑий в ÑÑÑогом Ñежиме пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ "заÑиÑÑкÑ" Ð´Ð»Ñ ÑпеÑиÑикаÑии в бÑдÑÑем Ñелизе ECMAScript:
"use strict";
if (true) {
function f() {} // !!! ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка
f();
}
for (var i = 0; i < 5; i++) {
function f2() {} // !!! ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка
f2();
}
function baz() {
// веÑно
function eit() {} // Ñоже веÑно
}
ÐаннÑй запÑÐµÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð¾ÑобенноÑÑÑÑ ÑÑÑогого Ñежима, поÑÐ¾Ð¼Ñ ÑÑо Ñакое обÑÑвление ÑÑнкÑий ÑвлÑеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из ÑаÑÑиÑений оÑновного ES5. Ðо ÑÑо ÑекомендаÑÐ¸Ñ ÐºÐ¾Ð¼Ð¸ÑеÑа ECMAScript, и бÑаÑзеÑÑ ÑеализÑÑÑ ÐµÑ.
СÑÑогий Ñежим в бÑаÑзеÑаÑРболÑÑинÑÑве бÑаÑзеÑов в наÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑÑогий Ñежим Ñеализован. Ðднако не ÑÑÐ¾Ð¸Ñ Ð²Ð¿Ð°Ð´Ð°ÑÑ Ð² ÑлепÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑÑ Ð¾Ñ Ð½ÐµÐ³Ð¾, поÑÐ¾Ð¼Ñ ÑÑо ÑÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÐеÑÑий бÑаÑзеÑов, поддеÑживаÑÑÐ¸Ñ ÑÑÑогий Ñежим лиÑÑ ÑаÑÑиÑно или вовÑе не поддеÑживаÑÑÐ¸Ñ Ð¾Ð½Ñй (напÑимеÑ, Internet Explorer ниже веÑÑии 10!). СÑÑогий Ñежим изменÑÐµÑ ÑеманÑикÑ. Ðадежда на ÑÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÑиведÑÑ Ðº оÑибкам и погÑеÑноÑÑÑм в бÑаÑзеÑÐ°Ñ , в коÑоÑÑÑ ÑÑÑогий Ñежим не Ñеализован. ÐÑоÑвлÑйÑе оÑÑоÑожноÑÑÑ Ð¿Ñи иÑполÑзовании ÑÑÑогого Ñежима, и подкÑеплÑйÑе надÑжноÑÑÑ ÑÑÑогого Ñежима ÑеÑÑами оÑобенноÑÑей, коÑоÑÑе пÑовеÑÑÑÑ, наÑколÑко веÑно ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ ÐµÐ³Ð¾ ÑÑагменÑÑ. ÐаконеÑ, ÑÑаÑайÑеÑÑ ÑеÑÑиÑоваÑÑ Ñвой код в бÑаÑзеÑÐ°Ñ , как поддеÑживаÑÑÐ¸Ñ , Ñак и не поддеÑживаÑÑÐ¸Ñ ÑÑÑогий Ñежим. ÐÑли Ð²Ñ Ð¿ÑоводиÑе ÑеÑÑиÑование ÑолÑко в ÑÐµÑ Ð±ÑаÑзеÑÐ°Ñ , коÑоÑÑе не поддеÑживаÑÑ ÑÑÑогий Ñежим, Ñо вполне веÑоÑÑно Ñ Ð²Ð°Ñ Ð¿Ð¾ÑвÑÑÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð² бÑаÑзеÑÐ°Ñ , его поддеÑживаÑÑÐ¸Ñ , и наобоÑоÑ.
СмоÑÑиÑе Ñакже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