Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么$http';s回调不知道自身之外的变量吗?_Javascript_Angularjs - Fatal编程技术网

Javascript 为什么$http';s回调不知道自身之外的变量吗?

Javascript 为什么$http';s回调不知道自身之外的变量吗?,javascript,angularjs,Javascript,Angularjs,例如,假设我有以下代码: for(var i=0; i < itemlist.length; i++){ var item = itemlist[i]; var id = item.id; $http.get(id + '.json').success(function(data){ //do something with data. console.log(item.name); } } for(变量i=0;i

例如,假设我有以下代码:

for(var i=0; i < itemlist.length; i++){
    var item = itemlist[i];
    var id = item.id;
    $http.get(id + '.json').success(function(data){
        //do something with data.
        console.log(item.name);
    }
}
for(变量i=0;i
控制台中显示的名称将是一个重复值(我认为数组itemlist中的第一个值),即回调函数不知道变量项


就我的理解水平而言,这很奇怪。有没有办法向这个回调函数传递额外的变量-和/或-有人能告诉我为什么这个变量的作用域是这样的吗?

假设itemlist是一个数组,你可以使用

正如我在评论中指出的,问题是在循环中错误地使用了闭包变量

如果你想的话,你甚至可以用like


要将值与回调函数关联,应该使用bind。 通过这种方式,您可以将任何对象附加到回调并通过此对象访问它。对象:

function yourFunction() {
    for(var i=0; i < itemlist.length; i++){
    var item = itemlist[i];
    var id = item.id;
    var onSuccess = onSuccess.bind({item: item});
    $http.get(id + '.json').success(onSuccess);

它应该关闭就好了。&…或者可能
itemlist.forEach(function(item,i){…})
?@JanTuroňyes…在我当前的项目中,我需要支持IE8+,所以我总是使用那些库函数。。。。
itemlist.forEach‎ (function (item, i) {
    var id = item.id;
    $http.get(id + '.json').success(function (data) {
        //do something with data.
        console.log(item.name);
    })
})
function yourFunction() {
    for(var i=0; i < itemlist.length; i++){
    var item = itemlist[i];
    var id = item.id;
    var onSuccess = onSuccess.bind({item: item});
    $http.get(id + '.json').success(onSuccess);
 function onSuccess(data) {
    console.log(this.item.name);
}