0

içine (bir atama olmadan) sol ve üçlü dönüştürme Ben Krasimir tarafından inşa mükemmel JavaScript çiftleşmiş motoru, buldum, ben sadece ne ihtiyaç vardır.
Odaklama motoru harika çalışıyor ancak doğal olarak bu konuda hackleme isteğine karşı koyamıyorum ve hatta birkaç özellik ekleyemiyorum.
Maalesef kodun bazılarını anlamakta sorun yaşıyorum. İşte JavaScript çiftleşmiş motoru - koşullu deyimi (ler)

var TemplateEngine = function(html, options) { 
    var re = /<%([^%>]+)?%>/g, 
    reExp = /(^()?(if|for|else|switch|case|break|{|}))(.*)?/g, 
    code = 'var r=[];\n', 
    cursor = 0, 
    match; 
    var add = function(line, js) { 
    /* --begin problem */ 
    js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : ''); 
    /* --end problem */ 
    return add; 
    }; 
    while (match = re.exec(html)) { 
    add(html.slice(cursor, match.index))(match[1], true); 
    cursor = match.index + match[0].length; 
    } 
    add(html.substr(cursor, html.length - cursor)); 
    code += 'return r.join("");'; 
    return new Function(code.replace(/[\r\t\n]/g, '')).apply(options); 
}; 

anlamıyorum çizgidir: Burada


kodudur

js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : ''); 

Ben JavaScript için yeni değilim ama bu bazı garip görünümlü kod ve ne geliyor Sol el ödevi olmayan bir üçlü operatör olduğunu biliyorum (yanılıyorsam beni düzelt)

Yazarın ne yaptığını daha iyi anlamak için, üçlü operatörün koşullu ifadelere dönüştürülmesi.

if(js) { 
    if(code += line.match(reExp)) { 
    line += '\n'; 
    } else { 
    line += 'r.push(' + line + ');\n'; 
    } 
} else { 
    if(code += line !== '') { 
    line += 'r.push("' + line.replace(/"/g, '\\"') + '");\n'; 
    } else { 
    line += ""; 
    } 
} 

Bu başarısız oldu ve hata "Yakalanmayan SyntaxError: Beklenmedik belirteç" attı:

herkes beni koşullu ifadeleri bu kodu dönüştürmek ve hatta belki yardımcı olabilir

Bu

Bugüne kadar ne var Kodun ne yaptığı konusunda bana bir açıklama yapalım?

Ayrıca, IE8'in bu kodu destekleyip desteklemediğini merak ettim mi?
NOT: IE8 desteğine aldırış etmiyorum Bu şablon altyapısının IE8'i destekleyip desteklemediğini bilmek istiyorum.

Bu durumda sadece C'deki gibi JavaScript Krasimir en Website veya Krasimir en Github

+1

Alternatif kodunuzda bir sözdizimi hatası yok. Bu hatayı alıyorsanız, başka bir yerden geliyor. – Pointy

+0

@Pointy Evet, düşündüğüm de bu ve şablon kodunun sözdizimi hatası içermediğinden% 100 olumlu olduğumdan, aynı kodu örnekte kullandığımdan dolayı, belki de yanlış bir şeyleri yanlış anlamışımdır? –

cevap

0

Bu sorunun çok fazla ilgi görmediğini biliyorum, ancak bu soruna yanıt veren birinin, bu sorunla karşılaşan birine yardımcı olacağını umuyordum.
JSHint'ten bir yardım ve yardımı ile bu sorunun çözümünü çözdüm.
Geçerli derlenmiş satırı "satır" değişkenine değil "satır" değişkenine ekliyordum.
Bu, şablonun son satırını ve derlenmiş kodun geri kalanını içeren "satır" değişkeni ile sonuçlanır; bu, "kod" değişkeninin koduna sahip olmadığı anlamına gelir: D ve null için eşdeğerdir.orada burada "kod" değişkeni ile "satırı" değişkeni değiştirilmesi ve burada optimizasyonlar birkaç yaptıktan sonra

var add = function(line, js) { 
    if(js) { 
    if(code += line.match(reExp)) { 
     line += '\n'; 
    } else { 
     line += 'r.push(' + line + ');\n'; 
    } 
    } else { 
    if(code += line !== '') { 
     line += 'r.push("' + line.replace(/"/g, '\\"') + '");\n'; 
    } else { 
     line += ""; 
    } 
    } 
}; 

: Burada

Ben yanlış ne yaptığını anladım önce vardı kodudur son çalışma cevap edilir: sen koduna eklemek gerekir satır kod eklemek gerekiyordu değildir

var add = function(line, js) { 
    if(js && typeof js !== "undefined") { 
    if(line.match(reExp)) { 
     code += line; 
    } else { 
     code += "r.push(" + line + ");"; 
    } 
    } else if(line !== "") { 
    code += "r.push(\"" + line.replace(/"/g, '\\"') + "\");"; 
    } 
}; 
0

üçlü operatöre ?: çalışmalarına çiftleşmiş motoru bulabilirsiniz, biz

js? (code += (line.match(reExp)? line + '\n' : 'r.push(' + line + ');\n') 
    : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : ''); 

gibi ifadesini biçimlendirmek bir if-else bloğu gibi görünüyor. Tüm ifade, js değerine bağlı olarak iki bileşik atama ifadesinden birine değerlendirir. Bu ifadenin değeri göz ardı edilir, ancak yine de yan etkileri olabilir. Yazar bunu if (js) { code += ...; } else { code += ...; } yerine yazmayı seçti.

+0

Evelyn, orijin cevabının yasaklandığı posteri ortaya çıkardı, bu yüzden cevabınızı kabul ettim, temsilcisi birisine gitmeli :) Bir kez daha cevabınız için çok teşekkürler, şerefe. –

1

, şunu deneyin:

if (js && type(js) !== "undefined") { 
    if (line.match(reExp)) { 
    code += line; 
    } else { 
    code += "r.push(" + line + ");"; 
    } 
} else if (line !== "") { 
    code = code + "r.push(\"" + line.replace(/"/g, '\\"') + "\");"; 
}