2010-03-10 1 views
0

Основная проблема, о которой я думаю, заключается в том, является ли назначение переменной в операторе if безопасным и надежным в разных браузерах. Если это безопасно, я бы хотел использовать его.Мне нравится этот трюк ... но он безопасен в JavaScript

Здесь он читает запрос и если переменная SN с переменными числа строк является либо щебетать, либо Facebook, то она вводит значение if, и вы можете использовать переменную, если переменная querystring не существует или имеет другое значение, то она переходит в остальное.

if(socialNetwork = (window.location.search.indexOf("SN=Twitter") > 0) ? "Twitter" : ((window.location.search.indexOf("SN=Facebook") > 0) ? "Facebook" : null)) 
    { 
     alert(socialNetwork); 
    } 
    else 
    { 
     alert("nope"); 
    } 
+13

Чтобы быть тупым, что код бога-ужасно читать и независимо от безопасности в JavaScript вы должны никогда не делайте этого, ради других людей, которые могут захотеть прочитать ваш код в будущем. Одного Джона Ресига достаточно для этого мира. –

+3

@Marc Я думал, что Джон был довольно консервативным, по стилю; прочитайте руководство по стилю jQuery. Может быть, вы знаете кое-что, чего я не делаю :-) – Pointy

+0

Я полностью согласен с Marc W. Независимо от того, работает ли это, сделайте код более понятным. Я могу взглянуть на эту линию на мгновение и не знаю, что она делает. – Aaron

ответ

4

Это уродливое.

var uselessSocialNetworkingApp = window.location.search.replace(/.*\bSN=(\w+)\b.*/, "$1"); 
if (uselessSocialNetworkingApp) 
    alert("yay!"); 
else 
    alert("no"); 

Это добрейшое смешно, что не было бы, что отвратительное строительство в «если» заголовке, но это было бы «если» вместо «?» Выражения внутри «тревоги» Список аргументов :-)

Кроме того, чтобы быть хотя бы слегка симпатизирующим намеченному стилю, это пример того, что означает утверждение «let» в ультрасовременном Javascript.

+0

Спасибо! Это намного чище. – Adam

5

Это часть дизайна языка и должна работать в каждом браузере, но его очень трудно читать.

0

О, мой! Это действительно и всегда должно работать, предполагая, что вы создаете переменную socialNetwork в другом месте, никогда не создавайте намеченные глобальные переменные. Тем не менее, это действительно странный способ решить вашу проблему. Почему бы не создать функцию, которая возвращает социальную сеть, чтобы немного отвлечь ее?

Это говорит, что если вы действительно хотите раствор одна линия, как об этом ?:

alert(function(){ var m = /SN=([A-Za-z]+)/.exec(window.location.search); return (m ? m[1] : null)}()); 
+0

Ну, это сокращает лишние символы, отправляемые через Интернет, как 5 байт. Для производства я думаю, что это прекрасно, но для развития я бы предложил правильное кодирование – WarmWaffles

0
location.socialNetwork== (function(){ 
var s= location.search || ''; 
s= /SN=([a-zA-Z]+)/.exec(s) || []; 
return s[1] || null; 

})() 

alert(location.socialNetwork) 
Смежные вопросы