2012-01-23 3 views
1

Javascript: что означает эта линия?

!function ($) 
+6

Ничего, без контекста. Это не отдельное выражение. Покажи нам все остальное! – Cameron

+0

Можете ли вы дать некоторый контекст, как ссылку на файл, откуда он появился, или, по крайней мере, несколько строк выше и ниже? – Simon

+0

Похоже на начало функции самоисполнения, которая не вернет значение. – Havvy

ответ

2

Я думаю, что нам не хватает данных, но я делаю ставку, что кусок от закрытия в условном выражении или тройном.

var test = 'Testing!'; 
(!function ($) { 
    alert($); 
    return false; 
}(test) ? alert("bad") : alert("good")); 

http://jsfiddle.net/MattLo/WpqfN/3/

+4

Это не закрытие. – Havvy

+1

@ Хэвви: Конечно. Все функции создают замыкания в JS. –

+0

Мэтт Ло: Вы, безусловно, правы в отношении IIFE, но скорее всего, '!' Используется вместо '()', чтобы заставить функцию оцениваться как часть выражения. [См. Этот вопрос] (http://stackoverflow.com/q/8611700/1106925). Таким образом, результат возврата функции, вероятно, игнорируется. –

6

Ставлю немного более полную версию будет выглядеть следующим образом:

!function ($) { 
    // some code 
}(jQuery); 

В основном выше использует оператор ! иметь анонимную функцию можно интерпретировать как выражение функции, которое затем может быть немедленно вызвано. Уберите !, и у вас есть недопустимое объявление функции (или оператор функции, в зависимости от вашей предпочтительной терминологии) - неверно, потому что у него нет имени. Более обычный способ сделать это, поместив его в скобках:

(function ($) { 
    // some code 
})(jQuery); 

Но некоторые люди хотели бы сохранить характер с помощью !, а не круглых скобок.

Одна из причин, почему вы можете использовать такой код, чтобы вы могли создать некоторые рабочие переменные, которые не попадают в глобальную область. Или, изнутри анонимной функции, создать объект, который находится в глобальной области действия, но имеет методы, которые могут обращаться к закрытым переменным в области анонимной функции.

Что касается $ аргумента, я просто предполагаю, что jQuery будет передан в качестве параметра функции, так как это является общим при использовании имени аргумента $. Одна из причин, по которой вы можете это сделать, - это использовать другую библиотеку, которая определяет $ одновременно с использованием jQuery, но с помощью $ для jQuery в этом блоке.

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