Niedawno eksperymentowałem z poleceniem eval()
, próbując wymyślić nową konwencję dla nowego projektu.
Co chciałem było to: Spodobał mi się pomysł posiadania prywatną, publicznego i uprzywilejowane metod, Ala. Doug Crockford's article, ale chciałem być w stanie ujawnić publiczne metody/zmienne na Górze moich klas, a nie na dole, jak zwykle.
Rozważ to:
var Singleton = function() {
// Private
function _one() {
// code...
}
function _two() {
// code...
}
// Public
return {
one: _one,
two: _two
};
}();
Z trzech eval()
„s (dwa zagnieżdżone wewnątrz budynku głównego) udało mi się mieć tę składnię:
var Singleton = function() {
// Public
var $interface = {
one: $forward,
two: $forward
};
// Private
function _one() {
// code...
}
function _two() {
// code...
}
// This does the magic
return eval($init);
}('Singleton');
i wbrew wszelkim przeciwnościom i common- poczucie, że zadziałało. (Zauważ, że chciałem również znaleźć sposób na debugowanie moich przestrzeni nazw, dlatego możesz zobaczyć ciąg przekazany do singletonu.) $init
również to zajął.)
W każdym razie, myślę, że pisanie tego wszystkiego to znaczy to, że eval()
niekoniecznie jest cholernie szkodliwym działaniem ściółki JavaScript, którego należy unikać za wszelką cenę, i może być używane na więcej sposobów niż tylko na (zaufany!) kod wysyłany z serwera i dekompresowanie JSON.
(Chociaż w moim przypadku skończyło się jako psychicznego treningu, jak ja, ponieważ przekonałem się nie męczyć się z prywatnego metod/zmienne po wszystkim i po prostu użyć ścisłe konwencję przestrzeni nazw.)
http://en.wikipedia.org/wiki/Eval#JavaScript –
To jest po prostu błędnie napisane 'evil()'.Nie używaj go. – slikts
* rollseyes * eval niekoniecznie jest zły, wszystko zależy od tego, do czego zamierzasz go użyć, a czasami naprawdę nie ma innego sposobu. –