javascript - 首先将变量声明为函数的目的是什么? (声明变量两次)
javascript - what is the purpose of declaring a variable a function first? (declaring variable twice)
这是我遇到的代码:
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;
给变量赋一个值然后立即给它赋另一个值是没有意义的。
您显示的代码将生成与此完全相同的结果(混淆较少):
var c = {
autoSelectFirst: !1,
appendTo: "body",
serviceUrl: null,
lookup: null,
.. etc..
lookupFilter: function(a, b, c) {
return -1 !== a.value.toLowerCase().indexOf(c)
},
.. etc..
};
根据找到此代码位置的评论,它似乎是某些自动代码生成或最小化过程的一部分。
仅供参考,Javascript 不使用短语 "associative array"。第二个声明是一个 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,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
被使用的地方。
显然,缩小器足够聪明,可以看出最初称为 noop
的变量将不再使用,因此可以自由地为对象重用该变量名。令人印象深刻的代码分析,IMO。
这是我遇到的代码:
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;
给变量赋一个值然后立即给它赋另一个值是没有意义的。
您显示的代码将生成与此完全相同的结果(混淆较少):
var c = {
autoSelectFirst: !1,
appendTo: "body",
serviceUrl: null,
lookup: null,
.. etc..
lookupFilter: function(a, b, c) {
return -1 !== a.value.toLowerCase().indexOf(c)
},
.. etc..
};
根据找到此代码位置的评论,它似乎是某些自动代码生成或最小化过程的一部分。
仅供参考,Javascript 不使用短语 "associative array"。第二个声明是一个 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,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
被使用的地方。
显然,缩小器足够聪明,可以看出最初称为 noop
的变量将不再使用,因此可以自由地为对象重用该变量名。令人印象深刻的代码分析,IMO。