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

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


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

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

这个实际上和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 希望对你有帮助

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏