var orderObj = {};
$scope.orderObj = orderObj;
orderObj = {a:2};
console.log(orderObj);
console.log($scope.orderObj);
输出
Object {a: 2}
Object {}
请问是为什么?
var orderObj = {};
$scope.orderObj = orderObj;
orderObj = {a:2};
console.log(orderObj);
console.log($scope.orderObj);
输出
Object {a: 2}
Object {}
请问是为什么?
这个实际上和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:
Let lref be the result of evaluating LeftHandSideExpression.
Let rref be the result of evaluating AssignmentExpression.
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
GetReferencedName(lref) is either "eval" or "arguments"
Call PutValue(lref, rval).
Return rval.
它会首先对两边表达式求引用,再对右边表达式求值,并将值更新给左边的引用,也就是说对右边的引用求值后,是直接将指向{}
的地址赋给了左边,而不是a指向b,b再指向一个对象。
我写过一篇比较粗糙的文章:http://segmentfault.com/a/1190000002965140 希望对你有帮助
你这根本就是没搞清楚 。。。scope 是一个暴露给view用的数据模型, 这里面的数据定义的$scope开头的变量,只有用$scope开头才能调用,如果不加就只是当前文件的变量,所以你这两个,两个根本就在两个不同的 作用域里面,orderObj =xxx 这样的赋值根本就不会赋值到scope的orderObj 上去
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决