2011-06-20 6 views
1

Так что я программировал некоторые вещи в JavaScript, и через некоторое время я увидел, что я сделал опечатку в следующем фрагменте кода:Javascript странный синтаксис

(function() { 

    var someEl = document.getElementById('id-of-some-el'),l <----- 
     someOtherEl = document.getElementById('some-other-el'); 

    someEl.onclick = function() { 
     ... 
    }; 

})(); 

Обратите внимание, как l не должен быть там. Я тестировал это только в Firefox, но почему я не получил синтаксическую ошибку?

+2

Только предположение, но я думаю, что вы можете определить более одной переменной в Javacript с помощью запятых. Итак, в основном вы определили переменную 'someEl' и инициализировали ее (установив значение), а также создали переменную с именем' l' – fin1te

+0

@ fin1te: Но я не поставил точку с запятой после того, как я объявил 'l'. Разве это не синтаксическая ошибка? – Kevin

+0

[Nope] (http://inimino.org/~inimino/blog/javascript_semicolons). :) –

ответ

4

Вы пытались создать две переменные внутри var -statement:

var someEl = document.getElementById('id-of-some-el'), 
    someOtherEl = document.getElementById('some-other-el'); 

Введение запятой означает, что вы создали someEl и l:

var someEl = document.getElementById('id-of-some-el'),l 

Точка с запятой в конец строк JS являются необязательными, так что теперь у вас есть вторая, вторая строка кода:

someOtherEl = document.getElementById('some-other-el'); 

И это справедливо, потому что вы можете назначить переменные без явно var -в них (хотя и привносить немного другую семантику в вашу программу).

+0

Без «var» неявно объявляется глобальным, так что это может стать большой болью для отслеживания. – jishi

+0

@jishi: Да, возможно, и хуже того, вы никогда не знаете, можете ли вы переписать переменную, уже объявленную в другом месте! Уф! –

1

поскольку окончание линии с полом двоеточием не является обязательным этим код оценивается так:

var someEl = document.getElementById('id-of-some-el'), l; 
someOtherEl = document.getElementById('some-other-el'); 
1

Он действует с запятой, не является обязательной.

someEl и l бы локальные переменные

someOtherEl будет глобальным, поскольку он теперь не имеет вар

l будет неопределенными.

Используйте консоль/предупреждение, чтобы увидеть это.

var a,b,c; 
alert(a); 
0

Вы случайно создали три переменные: someEl, l и someOtherEl

Новая линия обозначает новое заявление, в данном случае.

Если поставить их все на той же строке, например:

var someEl = document.getElementById('id-of-some-el'),l someOtherEl = document.getElementById('some-other-el'); 

вы получите Syntax Error: Unexpected identifier, как вы ожидали.

0

Это равно

var someEl = document.getElementById('id-of-some-el'); 
var l; 
someOtherEl = document.getElementById('some-other-el'); 

Что на самом деле не ошибка синтаксиса в более строгих языках либо, но это было бы возможно, дать предупреждение о неиспользуемой переменной в транслируемых языках.

JavaScript очень прощает, что может иногда давать интересные сеансы отладки, так как он с радостью принимает неопределенную переменную (которая может быть опечаткой для другой переменной), внезапно появляющаяся в любом месте.

+1

'someOtherEl' отсутствует спецификатор' var', поэтому это не _quite_ то же самое. –

+0

Да, я заметил сразу после того, как я его представил .. исправлено сейчас –

+0

@Stein: 'l' имеет это, хотя ... –

-1

Хотя код, который вы написали, является технически обоснованным, JSLint сообщит об этом как предупреждение.

Проблема в строке 1 символ 56: Ожидаемый ';' и вместо этого увидел 'someOtherEl'.

var someEl = document.getElementById('id-of-some-el'),l

Проблема в строке 2 символа 9: 'someOtherEl' был использован до того, как было определено .

someOtherEl = document.getElementById('some-other-el');

+0

Только при строгих проверках. Они скорее напоминают «предупреждения», чем ошибки. –

+0

Хорошая точка, плохая семантика с моей стороны. Ответ обновлен, чтобы отразить это. – Scottie

+0

Лучше. Тем не менее, на самом деле он не отвечает на вопрос, хотя .. :) –

Смежные вопросы