search

Home  >  Q&A  >  body text

javascript - angularjs js原型链问题 scope相关 急急急急 在线等!!!

var orderObj = {};
$scope.orderObj = orderObj;
orderObj = {a:2};
console.log(orderObj);
console.log($scope.orderObj);


输出
Object {a: 2}
Object {}
请问是为什么?

伊谢尔伦伊谢尔伦2828 days ago637

reply all(4)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 15:43:51

    var orderObj = {};
    $scope.orderObj = orderObj;
    orderObj.a = 2; // 问题在这里, 你把orderObj重新赋值了, 但是$scope中还是指向旧的orderObj
    console.log(orderObj);
    console.log($scope.orderObj);

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:43:51

    这个实际上和angular无关。

    var a = {}
    b = a
    a = { a: 2 }
    console.log(a)  // { a: 2 }
    console.log(b)  // {}

    导致这个现象的原因是赋值表达式,根据ECMA规范中的定义赋值运算符的产生式(production)以及运算过程如下:

    The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:

    1. Let lref be the result of evaluating LeftHandSideExpression.

    2. Let rref be the result of evaluating AssignmentExpression.

    3. Let rval be GetValue(rref).

    • Throw a SyntaxError exception if the following conditions are all true:

    • Type(lref) is Reference is true

    • IsStrictReference(lref) is true

    • Type(GetBase(lref)) is Environment Record

    1. GetReferencedName(lref) is either "eval" or "arguments"

    2. Call PutValue(lref, rval).

    3. Return rval.

    它会首先对两边表达式求引用,再对右边表达式求值,并将值更新给左边的引用,也就是说对右边的引用求值后,是直接将指向{}的地址赋给了左边,而不是a指向b,b再指向一个对象。

    我写过一篇比较粗糙的文章:http://segmentfault.com/a/1190000002965140 希望对你有帮助

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:43:51

    你这根本就是没搞清楚 。。。scope 是一个暴露给view用的数据模型, 这里面的数据定义的$scope开头的变量,只有用$scope开头才能调用,如果不加就只是当前文件的变量,所以你这两个,两个根本就在两个不同的 作用域里面,orderObj =xxx 这样的赋值根本就不会赋值到scope的orderObj 上去

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:43:51

    $scope.orderObj还是指向第一个orderObj,当然没有值啊

    reply
    0
  • Cancelreply