最近我开始通过Nicholas C. Zakas的书籍专业JavaScript开发人员学习JavaScript,我遇到了一些我自己无法解决的问题.
正如标题所说,这完全是关于JavaScript函数中的命名参数和参数对象.
例如,我们有这段代码:
function doAdd(num1 , num2) {
arguments[1] = 10;
alert(arguments[0] + num2);
}
doAdd(10 , 20);
Run Code Online (Sandbox Code Playgroud)
书中说,参数对象中的值会自动反映在相应的命名参数中,因此num2输入值为20的函数然后它会被覆盖arguments[1],最后得到一个值10.所有这些都清楚到此为止.然后它说
这种效果只有一种方式:更改命名参数不会导致参数中相应值的更改.
这就是问题开始的地方.
我尝试修改这段代码以了解作者所说的但我失败了.
例如
function doAdd(num1 , num2) {
arguments[1] = 10;
num2 = 40;
alert(arguments[0] + arguments[1]);
}
doAdd(10 , 20);
Run Code Online (Sandbox Code Playgroud)
此时num2进入函数具有值20再次,它改变到10通过arguments[1],然后它改变一次,以40经由命名参数num2这个时候.警报弹出50,因为对命名参数的更改不会导致更改相应的值arguments.为什么警报不会弹出20?
在JavaScript中获得了这个代码片段,它将多个属性定义到一个对象中.
var book = {};
Object.defineProperties(book , {
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function() {
return this._year;
},
set: function(newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
book.year = 2005;
alert(book.edition);
Run Code Online (Sandbox Code Playgroud)
因此,具有该代码的书声称alert(book.edition);将显示.2相反,它显示1.好像它永远不会执行访问者属性代码的一部分(year: get: set:).谁知道为什么会这样?
javascript ×2