使用.call()/。apply()时,函数参数在哪里?

时间:2013-05-30 17:50:47

标签: javascript

我遇到过需要使用.call()或.apply()调用另一个函数的情况:

function b() {
  alert(arg);
}

然后

function a(arg) {
  b.call();
}
a(123);

调用函数b,但不能访问 arg。 没关系,我可以通过范围..是吗?

function a(arg) {
  b.call(this);
}
a(123);

仍然没有 - 我无法从功能b访问 arg 。我该怎么办?

更新: 我不想修改b函数: - )

6 个答案:

答案 0 :(得分:6)

您仍然需要通过call(单独)或apply(作为数组)传递参数:

function a(arg1, arg2, arg3) {
  b.call(this, arg1, arg2, arg3);
  // or 
  b.apply(this, arguments)
  // or
  b.apply(this, [arg1, arg2, arg3]);
}

当然,没有任何关于你的情况的建议实际上使用 callapply:只需自己调用该函数。

function a(arg) {
  b(arg);
}

答案 1 :(得分:3)

不可能“通过范围”或类似的东西。函数的范围是在创建函数时确定的,因此只有在arg定义b时才能访问arg

如果this属于call,那么您可以使用this执行此操作,即使bthis的{​​{1}}相同a因为它在this中(当然这将修改function a (arg) { this.arg = arg; b.call(this); } function b () { console.log(this.arg); } 实际引用的任何内容,这可能会产生您可能不希望发生的副作用。)

b

另一种方法是将参数传递给arguments作为实际的函数参数。您可以使用function b () { console.log(arguments); }

访问函数的所有参数
{{1}}

答案 2 :(得分:1)

试试这个:

function a(arg) {
    b.apply(this, [arg]);
    // or
    // b.call(this, arg);
}

function b() {
    alert(arguments);
}

答案 3 :(得分:0)

我猜测问题在于b()。没有定义'arg'参数。尝试:
function b(arg) { alert(arg); }

function a(arg) {
  b.call(this,arg);
}
a(123);

现在它运行

(更新:调用需要参数(context functionarg1,functionarg2 ...))

答案 4 :(得分:0)

调用b时,您无法传递参数。

Function::call允许您传递固定数量的参数:

function a(arg1,arg2) {
    return b.call(this,arg1,arg2);
}

Function::apply允许您传递任意数量的参数,作为数组:

function a(arg1,arg2) {
    return b.apply(this,[arg1,arg2]);
}

// or

function a(arg1,arg2) {
    return b.apply(this,arguments);   // The magical 'arguments' variable
}

this是上下文对象,与范围不同。

答案 5 :(得分:-2)

假设由于某些原因您无法修改b的正文,您可以尝试这样的事情:

function a(arg) {
   eval("("+ b.toString() +")()");
}

DEMO