javascript-首先将变量声明为函数的目的是什么?(声明变量两次)

javascript-首先将变量声明为函数的目的是什么?(声明变量两次),javascript,minify,noop,Javascript,Minify,Noop,以下是我遇到的代码: var c = function() {}, c = { autoSelectFirst: !1, appendTo: "body", serviceUrl: null, lookup: null, .. etc.. lookupFilter: function(a, b, c) {

以下是我遇到的代码:

    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构造。

基于原始问题中的代码示例:

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;
将一个值赋给变量,然后立即将另一个值赋给它是没有意义的

您显示的代码将生成与此完全相同的结果(较少混淆):

根据发现该代码的地方的注释,它似乎是某些自动代码生成或最小化过程的一部分


仅供参考,Javascript不使用短语“关联数组”。第二个声明是一个Javascript对象。

我在网上找到了有问题的文件,结果证明这是有原因的

首先,应该注意,问题中的代码来自缩进的小型源代码

下面是一段代码:

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、onsearchrror: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
//v--最初它叫'noop'`
var noop=函数(){},
那=这个,
默认值={
自动选择第一个:错误,
附于:'正文',
serviceUrl:null,
查找:null,
onSelect:null,
宽度:“自动”,
明查斯:1,
最大高度:300,
请求者:0,
参数:{},
formatResult:YithAutocomplete.formatResult,
分隔符:null,
zIndex:9999,
键入:“GET”,
诺卡奇:错,

onSearchStart:noop,//这看起来像是某个人编写的代码,他真的不知道自己在做什么,或者是某种编辑错误的结果。你在哪里遇到的?代码是否缩小了?看起来可能是某种自动代码生成器的人工制品。变量和参数名确保它看起来像w是的,你能给出一些上下文吗?这是jquery.autoselect.min.js-version 1.2的非统一版本。9@NelsonTeixeira:我找到了一个,.在文档中搜索
c=function(){}
您将在第一行或第二行看到这一点。事实上,这只不过是一个缩微器的输出,因为代码显然不是手工编写的。@NelsonTeixeira:这是一个例子。如果您搜索
autoSelectFirst
,您将找到原始函数的源代码,即
noop=function(){}
,这意味着它将是一个无操作函数。显然,这只用于在它下面创建的对象文本中的默认值,因此
c
在创建过程中仍在引用func。迷你们知道它可以像这样重用变量名,这真是太聪明了。请参见@斜视对问题的评论。它阐明了为什么会这样做。+1值得对你的答案进行投票,这在原始问题的上下文中是正确的,尽管我认为正确的答案应该归因于@斜视,因为他的答案在以下方面是正确的(之前不知道)代码的大背景。请编辑OP的问题以显示代码的其余部分。由于代码显示在原始问题中,其他答案所述的初始
c
声明没有意义。但是,当你向问题添加更多内容时,就有了意义。这也是谷歌令人印象深刻的技能找到这些文件;“惊人的发现和分析。我应该补充说,我会认为这是一种反模式,实际上是手动编写这样的代码。这是非常误导人的,并不是立即显而易见的人阅读代码正在发生什么。代码生成器创建代码,不意味着人类消费被允许做优化技巧。at并不意味着可读,但人类不应该编写这样的代码供其他人阅读。对于人类可读的代码来说,这样的优化并不比使代码易于理解和维护更有利。@Bekinbacj:不,它是,因此不是循环引用。无论如何,这与d无关o作为一个“理智的编码者”是很重要的,因为正如答案所说,代码是从一个小型化的过程中产生的,最初不是手工编写的。
//   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