2016-05-05 5 views
4

Вот код, я столкнулся:javascript - какова цель сначала объявить переменную функцией? (Объявление переменного дважды)

var c = function() {}, 
     c = { 
      autoSelectFirst: !1, 
      appendTo: "body", 
      serviceUrl: null, 
      lookup: null, 
      .. etc.. 
      lookupFilter: function(a, b, c) { 
       return -1 !== a.value.toLowerCase().indexOf(c) 
      }, 
      .. etc.. 
     }; 

Почему c первым объявлен как пустая функция затем повторно объявлена ​​как объект? Разве это не просто перезаписывает объявление функции? Я полагаю, что это фундаментальная конструкция JS.

+11

Это похоже на код, написанный кем-то, кто действительно не знал, что они делают, или же результат какой-либо ошибки редактирования. – Pointy

+1

Где вы столкнулись с этим? Был ли код уменьшен? Похоже, это может быть артефакт какого-либо автоматизированного генератора кода. Имена переменных и параметров, несомненно, заставляют его выглядеть так. Можете ли вы дать какой-то контекст? –

+0

один день в далеком будущем Я узнаю все способы объявления функции в js. Добавлено еще одно сегодня. Интересно, что еще заманивает в темных уголках сети ...: D –

ответ

2

Основываясь на этом примере кода от первоначального вопроса:

var c = function() {}, 
    c = { 
     autoSelectFirst: !1, 
     appendTo: "body", 
     serviceUrl: null, 
     lookup: null, 
     .. etc.. 
     lookupFilter: function(a, b, c) { 
      return -1 !== a.value.toLowerCase().indexOf(c) 
     }, 
     .. etc.. 
    }; 

c = function() {}, часть в коде, который включен в вашем вопросе не имеет никакого смысла. Это как делать:

var x = 1, x = 3; 

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

код вы показываете будет генерировать один и тот же результат (с меньшим количеством путаницы), как это:

var c = { 
     autoSelectFirst: !1, 
     appendTo: "body", 
     serviceUrl: null, 
     lookup: null, 
     .. etc.. 
     lookupFilter: function(a, b, c) { 
      return -1 !== a.value.toLowerCase().indexOf(c) 
     }, 
     .. etc.. 
    }; 

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

FYI, Javascript не использует фразу «ассоциативный массив». Второе объявление - объект Javascript.

+0

см. Комментарий @squint на вопрос. Он пролил свет на то, почему это так. –

+0

+1 стоит иметь upvote для вашего ответа, что является правильным для контекста исходного вопроса, хотя я считаю, что правильный ответ следует отнести к @squint, поскольку его ответ правилен в отношении (не ранее известный) более широкий контекст кода. – Prusprus

7

Я нашел файл в поле зрения онлайн, и, оказывается, есть веская причина для этого.

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

Вот кусок кода:

var c=function(){},c={autoSelectFirst:!1,appendTo:"body",serviceUrl:null,lookup:null, 
onSelect:null,width:"auto",minChars:1,maxHeight:300,deferRequestBy:0,params:{}, 
formatResult:g.formatResult,delimiter:null,zIndex:9999,type:"GET",noCache:!1, 
onSearchStart:c,onSearchComplete:c,onSearchError:c, 
// -----------^------------------^---------------^ 

Так это код в вопросе, но немного больше. Важно отметить, что переменная c используется при создании объектного литерала с onSearchStart:c,onSearchComplete:c,onSearchError:c,.

Значит, значение c присвоено в объекте? Поскольку объект все еще находится в процессе создания, это означает, что c все еще ссылается на функцию, поэтому свойства, подобные onSearchStart, которые, как представляется, обработчики событий, получают пустую функцию по умолчанию.

Это имеет смысл.

Чтобы проверить, я также нашел исходный, неиспользованный источник. Вот соответствующий код:

// v---originally it's called `noop` 
var noop = function() { }, 
    that = this, 
    defaults = { 
     autoSelectFirst: false, 
     appendTo: 'body', 
     serviceUrl: null, 
     lookup: null, 
     onSelect: null, 
     width: 'auto', 
     minChars: 1, 
     maxHeight: 300, 
     deferRequestBy: 0, 
     params: {}, 
     formatResult: YithAutocomplete.formatResult, 
     delimiter: null, 
     zIndex: 9999, 
     type: 'GET', 
     noCache: false, 
     onSearchStart: noop, // <---here it's being used 
     onSearchComplete: noop, // <---here it's being used 
     onSearchError: noop, // <---here it's being used 

Так что это яснее, что noop, что в целом означает отсутствие операций, имеет свое название и действительно используется в объект создается непосредственно под ним. Кроме того, это только место noop используется во всем файле

Таким образом, очевидно, что minifier был достаточно умен, чтобы увидеть, что переменная, первоначально называемая noop, больше не будет использоваться, поэтому она может свободно использовать это имя переменной для объекта.Впечатляющий бит анализа кода, ИМО.

+1

Пожалуйста, отредактируйте вопрос OP, чтобы показать остальную часть кода. Поскольку код указан в исходном вопросе, нет никакого смысла в первоначальном объявлении 'c', которое является тем, на что обращается другой ответ. Но, когда вы добавляете больше к вопросу, тогда возникает точка. – jfriend00

+0

Это были также впечатляющие навыки Google, чтобы найти эти файлы;) –

+0

@NelsonTeixeira: Мне повезло. Google придумал только один результат, когда я использовал 'filetype: js'. –

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

  • Нет связанных вопросов^_^