Bəzi funksiyalar üçün ciddi ECMAscript rejimini əlil edə bilərəmmi?

Mənim sualım haqqında MDC və ECMAscript spesifikasiyalarında heç bir şey tapmadım. Yəqin ki, kimsə bu problemi həll etmək üçün daha çox "hacker" yolu bilir.

Mənim ətrafımdakı hər bir javascript faylında "use strict" deyə çağırıram. Bütün fayllarım bu şəkildə başlamışdır.

 (function(win, doc, undef) { "use strict"; // code  functions }(window, window.document)); 

İndi məndə səhvləri işləyən xüsusi funksiya var. Bu funksiyalar kontekst yığını izlərini təmin etmək üçün .caller xüsusiyyətindən istifadə edir. Belə görünür:

 var chain = (function() { var _parent = _error, _ret = ''; while( _parent.caller ) { _ret += ' -> ' + _parent.caller.name; _parent = _parent.caller; } return _ret; }()); 

Amma əlbəttə ki, ciddi rejimdə. .caller qeyri-diskriminatsional dəstəkdir, bu da ekstraksiya zamanı atılır. Beləliklə, mənim sualım: hər kəsin daha çox "funksional" fəaliyyətini necə aradan qaldıracağını bilirmi?

"use strict"; çağırıldıqdan sonra bütün funksiyaların miras alınmasıdır. İndi biz sadəcə "use strict"; deyərək, müəyyən funksiyalarda ciddi rejimi istifadə etmək imkanı var "use strict"; bunların başında, lakin əksinə nail olmaq üçün bir yol varmı?

49
16 мая '11 в 19:11 2011-05-16 19:11 Mayın 16-da saat 19:11 'də təyin olundu
@ 3 cavab

Xeyr, hər bir funksiya üçün ciddi rejimdən çıxa bilməzsiniz.

Qətiyyən düzgün rejim işlədildiyini anlamaq vacibdir; Qiymət - bu icra deyil, funksiyanın bəyannaməsini təsir edir. Sert kodda elan edilmiş hər hansı bir funksiya ən ciddi funksiyadır. Bir string kodundan çağırılan heç bir funksiya mütləq ciddi deyil:

 (function(sloppy) { "use strict"; function strict() { // this function is strict, as it is _declared_ within strict code } strict(); sloppy(); })(sloppy); function sloppy(){ // this function is not strict as it is _declared outside_ of strict code } 

Qətiyyətsiz bir kodun xaricində bir funksiyanı necə təyin edə biləcəyimizi və sonra onu ciddi bir funksiyaya köçürə bilər.

Siz nümunənizdə oxşar bir şey edə bilərsiniz - "əsəbi" funksiyaları olan bir obyektin olması və sonra bu obyekti dərhal funksiya deyilən bu kiçik vəziyyətə keçir. Əlbəttə ki, bu "əsəbi" funksiyalar əsas qanadlı funksiyadan dəyişənlərə istinad etməlidir.

Həm də bilirik ki, dolayı qiymətləndirmə - başqasının təklif etdiyi - həqiqətən də kömək etmir. Qlobal kontekstdə etdiyi bütün işlər kodu yerinə yetirir. Yerli olaraq təyin olunan bir funksiyaya zəng etməyə çalışarsanız, dolayı qiymətləndirmə belə tapa bilməz:

 (function(){ "use strict"; function whichDoesSomethingNaughty(){  } // ReferenceError as function is not globally accessible // and indirect eval obviously tries to "find" it in global scope (1,eval)('whichDoesSomethingNaughty')(); })(); 

Qlobal qiymətləndirmə ilə bağlı bu qarışıqlıq, yəqin ki, qlobal qiymətləndirmənin qlobal obyektə sərt rejimdən istifadə etmək üçün istifadə oluna biləcəyi ehtimal olunur (bu, yalnız this mümkün deyil):

 (function(){ "use strict"; this; // undefined (1,eval)('this'); // global object })(); 

Amma sualına geri dön ...

Siz funksiyanı qurucudan istifadə edərək yeni funksiyanı aldatmaq və bəyan edə bilərsiniz, devralınmamaq üçün düsturla nə olur, amma qeyri-standart funksiyadan decompiling funksiyalarına əsaslanacaq və xarici dəyişənlərə müraciət etmək bacarığını itirməyəcəksiniz .

 (function(){ "use strict"; function strict(){  } // compile new function from the string representation of another one var sneaky = Function('return (' + strict + ')()'); sneaky(); })(); 

Xatırlayın ki, FF4 + spesifikasiyaya (demək olar ki, deyə bilərəm) razılaşmır və funksiyanı istifadə edərək yaradılan funksiyanı yanlış olaraq qeyd edir. Bu, digər string dəstəyi versiyalarında baş vermir (məsələn, Chrome 12+, IE10, WebKit).

67
18 мая '11 в 5:14 2011-05-18 05:14 cavab 18 may, 18 may 2011-ci il saat 05:14 radələrində verilir

( Http://javascriptweblog.wordpress.com/2011/05/03/javascript-strict-mode/ )

(...) Qətiyyən sərt bir funksiyanın cəsədinə daxil edilən qeyri-ciddi funksiyalar tətbiq olunmur (ya da arqumentlər kimi qəbul olunduqda və ya call istifadə edərək apply ).

Beləliklə, səhv rejimi olmayan başqa bir faylda səhv üsulları konfiqurasiya edərsinizsə, məsələn, onları parametr kimi qəbul edin:

border=0
 var test = function(fn) { 'use strict'; fn(); } var deleteNonConfigurable = function () { var obj = {}; Object.defineProperty(obj, "name", { configurable: false }); delete obj.name; //will throw TypeError in Strict Mode } test(deleteNonConfigurable); //no error (Strict Mode not enforced) 

... işləməlidir.

3
16 мая '11 в 19:26 2011-05-16 19:26 cavab 16 may 2011-ci il tarixində saat 19: 26-da verilmişdir

Alternativ yalnız bunu edir.

 var stack; if (console  console.trace) { stack = console.trace(); } else { try { var fail = 1 / 0; } catch (e) { if (e.stack) { stack = e.stack; } else if (e.stacktrace) { stack = e.stacktrace; } } } // have fun implementing normalize. return normalize(stack); 
2
16 мая '11 в 19:18 2011-05-16 19:18 cavab 16 may 2011-ci ildə saat 19: 18-da Raynos tərəfindən verilmişdi

tags ilə bağlı digər suallar və ya bir sual