var orderObj = {};$scope.orderObj = orderObj;orderObj = {a:2};console.log(orderObj);console.log($scope.orderObj);
输出Object {a: 2}Object {}请问是为什么?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
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:
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 上去
$scope.orderObj还是指向第一个orderObj,当然没有值啊
这个实际上和angular无关。
导致这个现象的原因是赋值表达式,根据ECMA规范中的定义赋值运算符的产生式(production)以及运算过程如下:
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 上去
$scope.orderObj还是指向第一个orderObj,当然没有值啊