本文探讨JavaScript中函数参数的修改机制。通过示例展示直接修改参数无效的情况,并深入解析利用caller属性和arguments.callee访问调用栈以修改外层函数参数的实现原理,揭示JavaScript动态调用与参数传递的特性。
JavaScript函数参数修改机制
在JavaScript中,可以在函数内部对传入的参数进行修改,示例如下。
代码实现如下:
function func1(name) {
name = 'lily';
alert(name);
}
func1('jack');//输出lily接下来看另一个例子。
代码实现如下:
function fun1(n) {
this.name = n;
}
function fun2(name) {
fun1.call(this,'lily');
alert(name);
}
fun2("jack");//输出"jack"利用caller属性修改参数
在上面的例子中,fun1函数试图修改fun2调用时的参数为“lily”,但并未成功,弹出的结果仍然是“jack”。这里需要思考其原因。
实际上,fun1函数仍然有能力修改fun2调用时的参数,这可以通过使用caller属性来实现。
代码实现如下:
function fun1() {
arguments.callee.caller.arguments[0] = 'lily';
}
function fun2(name) {
fun1.call(this,name);
alert(name);
}
fun2("jack");//输出"lily"由此可见,外层函数对于内层函数的调用栈是可见且可修改的。