Ank*_*kit 5 javascript function javascript-objects
2014年7月15日修订MDN指南,用于处理对象,指出:
如果在顶级脚本中使用对象初始值设定项创建对象,则JavaScript每次评估包含对象文字的表达式时都会解释该对象.
但是,在下面的代码段中,当objLit2.val2评估时,它不使用应该10和的最后一个值集100; 它改为使用1000哪个objLit2是定义时声明的值.为什么会这样?
var i = 1000;
function iPlus3() {
alert("iPlus3");
return i + 3;
}
var objLit2 = {
val: iPlus3,
val2: i = i + 1
};
function setValue() {
i = 10;
console.log("objLit2Val1", objLit2.val(), objLit2.val2); // Outputs 13 1001 and not 13 11
i = 100;
console.log("objLit2Val2", objLit2.val(), objLit2.val2); // Outputs 103 1001 and not 103 101
// If `val` is interpreted at the time of the call, why is `val2` not also interpreted on each call?
}
setValue();Run Code Online (Sandbox Code Playgroud)
objLit2是一个顶级声明。因此,它会在您的脚本首次执行时进行评估。一旦评估完成,该属性objLit2.val2就会设置其值。它不会仅仅因为您在代码中的其他地方引用 objLit2 就获得不同的值,除非您有意识地更改该属性的值objLit2.val2。
一旦objLit2被求值,该属性objLit2.val2就包含一个原始数字,该数字不再与变量有任何联系i。的值objLit2.val2是独立的,它的值不会受到任何其他变量的变化的影响。
JavaScript 中的基元(如数字和布尔值)存储为与任何其他变量没有联系的不同值。JavaScript 中的对象存储为对原始对象的引用。由于objLit2.val2是一个数字,因此它只是一个独立的值。
所以,你可以这样做:
var i = 1000;
var objLit2 = { val : iPlus3, val2 : i = i + 1 };
console.log(objLit2.val2); // shows 1001
i += 1000;
console.log(objLit2.val2); // still shows 1001
Run Code Online (Sandbox Code Playgroud)
另一方面,对象存储为对原始对象的引用。所以,如果你这样做:
var indexes = [1,2,3];
var objLit2 = { val : indexes, val2 : i = i + 1 };
console.log(objLit2.indexes); // shows [1,2,3]
indexes[0] = 0;
console.log(objLit2.indexes); // shows [0,2,3]
Run Code Online (Sandbox Code Playgroud)
因为数组是一个对象,所以当您在文字中指定数组时objLit2,它只是存储对该数组的引用(而不是数组的单独副本)。如果更改原始数组,您将看到包含对该数组的引用的所有其他变量的更改。
听起来您引用的内容将适用于在某个范围内(例如在函数内部)声明的对象,因为每次创建该范围时(例如每次运行函数时)都会重新评估它们。
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |