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

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

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; // 问题在这里, 你把orderObj重新赋值了, 但是$scope中还是指向旧的orderObj
console.log(orderObj);
console.log($scope.orderObj);

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


$scope.orderObj还是指向第一个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).

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

  2. Call PutValue(lref, rval).

  3. Return rval.

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

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

【热门文章】
【热门文章】