gpt4 book ai didi

javascript - 可以从闭包访问可变变量。我怎样才能解决这个问题?

转载 作者:IT王子 更新时间:2023-10-29 02:50:01 26 4
gpt4 key购买 nike

我正在通过 Twitter 使用 Typeahead。我遇到了来自 Intellij 的警告。这导致每个链接的“window.location.href”成为我的项目列表中的最后一项。

如何修复我的代码?

下面是我的代码:

AutoSuggest.prototype.config = function () {
var me = this;
var comp, options;
var gotoUrl = "/{0}/{1}";
var imgurl = '<img src="/icon/{0}.gif"/>';
var target;

for (var i = 0; i < me.targets.length; i++) {
target = me.targets[i];
if ($("#" + target.inputId).length != 0) {
options = {
source: function (query, process) { // where to get the data
process(me.results);
},

// set max results to display
items: 10,

matcher: function (item) { // how to make sure the result select is correct/matching
// we check the query against the ticker then the company name
comp = me.map[item];
var symbol = comp.s.toLowerCase();
return (this.query.trim().toLowerCase() == symbol.substring(0, 1) ||
comp.c.toLowerCase().indexOf(this.query.trim().toLowerCase()) != -1);
},

highlighter: function (item) { // how to show the data
comp = me.map[item];
if (typeof comp === 'undefined') {
return "<span>No Match Found.</span>";
}

if (comp.t == 0) {
imgurl = comp.v;
} else if (comp.t == -1) {
imgurl = me.format(imgurl, "empty");
} else {
imgurl = me.format(imgurl, comp.t);
}

return "\n<span id='compVenue'>" + imgurl + "</span>" +
"\n<span id='compSymbol'><b>" + comp.s + "</b></span>" +
"\n<span id='compName'>" + comp.c + "</span>";
},

sorter: function (items) { // sort our results
if (items.length == 0) {
items.push(Object());
}

return items;
},
// the problem starts here when i start using target inside the functions
updater: function (item) { // what to do when item is selected
comp = me.map[item];
if (typeof comp === 'undefined') {
return this.query;
}

window.location.href = me.format(gotoUrl, comp.s, target.destination);

return item;
}
};

$("#" + target.inputId).typeahead(options);

// lastly, set up the functions for the buttons
$("#" + target.buttonId).click(function () {
window.location.href = me.format(gotoUrl, $("#" + target.inputId).val(), target.destination);
});
}
}
};

在@cdhowie 的帮助下,还有一些代码:我将更新更新程序以及 click() 的 href

updater: (function (inner_target) { // what to do when item is selected
return function (item) {
comp = me.map[item];
if (typeof comp === 'undefined') {
return this.query;
}

window.location.href = me.format(gotoUrl, comp.s, inner_target.destination);
return item;
}}(target))};

最佳答案

我喜欢 Closures Inside Loops 的段落,来自 Javascript Garden

它解释了三种方法。

在循环中使用闭包的错误方法

for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}

解决方案 1 使用匿名包装器

for(var i = 0; i < 10; i++) {
(function(e) {
setTimeout(function() {
console.log(e);
}, 1000);
})(i);
}

解决方案 2 - 从闭包返回一个函数

for(var i = 0; i < 10; i++) {
setTimeout((function(e) {
return function() {
console.log(e);
}
})(i), 1000)
}

解决方案 3,我最喜欢的,我想我终于理解了 bind - 耶!绑定(bind) FTW!

for(var i = 0; i < 10; i++) {
setTimeout(console.log.bind(console, i), 1000);
}

我强烈推荐Javascript garden - 它向我展示了这个以及更多 Javascript 怪癖(并让我更喜欢 JS)。

附注如果你的大脑没有融化,那么你那天的 Javascript 还不够。

关于javascript - 可以从闭包访问可变变量。我怎样才能解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16724620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com