今天我面临以下情况
$(".form")
.on('invalid', function () {
var invalid_fields = $(this).find('[data-invalid]');
console.log(invalid_fields);
})
.on('valid', function () {
var theForm = this;
$.blockUI({
message: $('#message'),
css: { top: '20%', width: '80%', height: '50%', left: '10%', border: 'none', background: 'none' },
timeout: 17000,
onUnblock: function() { theForm.submit(); }
});
return false;
})
.on('submit', function(){
return false;
});
我以为我知道闭包是如何工作的,但我无法理解ReSharper的行为。 ReSharper是否错误地(或错误地)交换了这两个警告?
我正在使用ReSharper Ultimate 2016.2.2
答案 0 :(得分:5)
我认为 resharper告诉你的是,这两个闭包还捕获你的代码认为它没有使用的其他东西强大的>在那个lambda。第一个闭包使用previewFileName
和this
(对于字段_userService
),所以你对它们的捕获显然是故意的 - 但是:你可能也不明白你也在捕捉previewFile
。捕获其他内容的原因是因为捕获的项的范围是相同的,因此编译器生成一个闭包以捕获所有previewFile
,this
,{{ 1}}和previewFileName
- 封闭实例有两个方法 - 一个用于fillModelAction
,另一个用于Func<string[], T>
。请注意,两个lambdas都使用Action<List<StreamWithFileName>>
,因此:没有警告。
了解这一点对于垃圾收集的原因可能很重要 - 如果一个lambda比另一个生存的时间长得多,你可能不想意外地保留其他东西,因此警告。例如,previewFileName
lambda使整个fillGraphicContentAction
保持活动状态(无论this
是什么),即使lambda不使用this
。