论坛首页 入门技术论坛

javascript动态方法调用与参数修改的问题

浏览 3413 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-11-28   最后修改:2008-12-01

javascript中可以对传进去的参数进行修改,如下

function func1(name) {
	name = 33;
	alert(name);
}
func1();//输出33

 

如果这样呢?

 

function fun1() {
    this.name = 33;
}

function fun2(name) {
    fun1.call(this,name);
    alert(name);
}

fun2("Jack");//输出"Jack"


 

 fun2中调用fun1将name改变为33。但实际上输出的仍然是"Jack".原因是两个function的arguments是不同的。

 

但是可以修改下fun1,利用caller属性改变

 

function fun1() {
    arguments.callee.caller.arguments[0] = 33;
}

function fun2(name) {
    fun1.call(this,name);
    alert(name);
}

fun2("Jack");//输出"33"

 

这次输出的是33。所以外层的函数(fun2)对于内部调用的函数(fun1)来说,总是可见的。可以利用arguments.callee.caller取得调用函数。

 

 

 

   发表时间:2008-11-28   最后修改:2008-11-28
call 与apply功能相同,差别在于传入的参数表现形式不同。每个函数都具有该方法

call调用形式为: funName.call (obj,para1,para2....paran)

apply调用形式为: funName.call(obj,[para1,para2...paran])

它们的功能都是:调用名为funName的函数,该函数的参数是 para1,para2...paran,
同时funName开始执行,在此时也仅在此时funName函数的this中有obj属性,如果原来funName函数本身有obj对象 则其值会被覆。
function fun1() {  
    this.name = 33;  
}  
  
function fun2(name) {  
    //下面这句将调用fun1函数。传入的参数是name
    //此时的this对象,是fun2的对象,该对象仅有属性name
    //因此fun1在执行时,fun1的this中将有这里传入的fun2的对象(即fun2中的name值传到了fun1
    //的this中),虽然fun1已经有了name属性,但却被fun2对象中的name所覆盖。
    fun1.call(this,name);  
    alert(name);  
}  
  
fun2("Jack");//输出"Jack" 





这里,接楼主话题,对这两个函数的使用进行总结一番。
0 请登录后投票
   发表时间:2008-12-01  
function fun1() {
    this.name = 33;
}

function fun2(name) {
    fun1.call(this,name);
    alert(this.name);
}

fun2("Jack");//输出"33"
0 请登录后投票
   发表时间:2008-12-05  
zhouyrt 写道

javascript中可以对传进去的参数进行修改,如下

function func1(name) {
	name = 33;
	alert(name);
}
func1();//输出33  此处加一个参数传进调用去更有说服力

 

如果这样呢?

 

function fun1() {
    this.name = 33;
}

function fun2(name) {//name不是属性
    fun1.call(this,name);
    alert(name);
}

fun2("Jack");//输出"Jack"


 

 fun2中调用fun1将name改变为33。但实际上输出的仍然是"Jack".原因是两个function的arguments是不同的。

 

但是可以修改下fun1,利用caller属性改变

 

function fun1() {
    arguments.callee.caller.arguments[0] = 33;
}

function fun2(name) {
    fun1.call(this,name);  
    alert(name);
}

fun2("Jack");//输出"33"

 

这次输出的是33。所以外层的函数(fun2)对于内部调用的函数(fun1)来说,总是可见的。可以利用arguments.callee.caller取得调用函数。

 

 

 

 

0 请登录后投票
   发表时间:2008-12-05  
我用可视化编辑的,怎么是这个样子....
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics