无法为JavaScript中的对象变量赋值[重复]

Posted

技术标签:

【中文标题】无法为JavaScript中的对象变量赋值[重复]【英文标题】:Can't assign values to variables of objects in JavaScript [duplicate] 【发布时间】:2017-07-05 01:40:00 【问题描述】:

我正在尝试读取 Angular js 中的文件,如果成功读取数据,它将将内容分配给对象的变量,否则会将“NA”分配给同一变量。

function customer($scope, $http) 
    var i;
    $scope.courses = [
        name: "CSE",
        capacity: "CSE.txt"
    , 
        name: "IT",
        capacity: "IT.txt"
    , 
        name: "ECE",
        capacity: "ECE.txt"
    ];

    for (i = 0; i < 3; i++)
        $http.get($scope.courses[i].capacity).then(function (success) 
            $scope.courses[i].capacity = success.data;
        , function (error) 
            $scope.courses[i].capacity = "NA";
        );



var myApp = angular.module("myApp", []);
myApp.controller("customerobj", customer);

我尝试以普通表格格式访问以下部分

<td>ng-repeat="course in courses">course.capacity</td>

但每次我这样做时都会抛出错误:“无法设置未定义的属性‘容量’”并显示文件名。即使找不到文件,也应该将值更新为“NA”。但它没有发生。请帮帮我

【问题讨论】:

尝试将您的 $http.get 包装在函数中。似乎是 javascript 中的闭包问题 @DarshakGajjar 因为错误是“无法设置未定义的属性'容量'”,这表明$scope.courses[i]undefined。而且因为这是循环的一部分,所以在我看来它是我链接的那个的副本 $scope.courses[i] 已经在数组定义中定义了吗? @SiddharthaChoudhury 你能检查浏览器控制台吗?错误在哪一行抛出? $scope.courses[i].capacity = "NA"; - 这一行 【参考方案1】:

将您的 http 服务调用包装在另一个函数中,如下所示,并在循环中调用该函数,以便循环索引 i 值将保留在函数范围内。

更新:

如果你不想要一个单独的函数,你也可以使用匿名函数

解决方案 1

for (i = 0; i < 3; i++) 
    (function (index) 
        $http.get($scope.courses[index].capacity).then(function (success) 
            $scope.courses[index].capacity = success.data;
        , function (error) 
            $scope.courses[index].capacity = "NA";
        );
     (i))

解决方案 2

for (i = 0; i < 3; i++) 
  serviceCall(i)


function serviceCall(index) 
  $http.get($scope.courses[index].capacity).then(function (success) 
    $scope.courses[index].capacity = success.data;
  , function (error) 
    $scope.courses[index].capacity = "NA";
  );

【讨论】:

它正在工作。先生,如果您不介意,您能解释一下吗? @SiddharthaChoudhury 它被称为 closure如果将函数放在循环之外,每个索引变量都会绑定到函数,否则它们将共享同一个变量。我建议看看closure inside loops 这就是复制的解决方案。相反,您应该投票关闭这个作为骗子...... @Andreas 虽然基本概念相似,但即使我们都发表了评论,OP 也无法理解上下文。然后只有我给出了答案。【参考方案2】:

for 循环中使用let

for (let i = 0; i < 3; i++)  
...... 

参考:

http://caniuse.com/#search=let https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let

【讨论】:

【参考方案3】:

代码正确。但 for 循环不是。当您将 console.log(i) 添加到错误函数时,您会看到 3。但您的数组有 3 个成员。 http请求是异步的。 for 循环不能等待它的响应。使用 Gangadhar Jannu 解决方案。

【讨论】:

【参考方案4】:

我认为使用 let in for 循环是处理此类情况的更好方法。 循环中的 let 可以将其重新绑定到循环的每次迭代中,确保从上一次循环迭代结束时重新为其分配值,因此可以使用它来避免闭包问题

for (let i = 0; i<3;i++) 


每次执行for循环内的异步代码时,都会得到正确的i值

【讨论】:

以上是关于无法为JavaScript中的对象变量赋值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JS的解析与执行过程(javascript面向对象一)

javascript的对象和变量之间的区分

无法分配给项目,因为它是一个 foreach 迭代变量 [重复]

JavaScript 使用=为变量赋值

监视 JavaScript 中的对象属性更改 [重复]

理解python变量赋值[重复]