1

我遇到了一种情况,我需要像这样使用 .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 函数:-)

4

6 回答 6

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]);
}

当然,您的情况并没有建议实际使用 callor apply:只需自己调用该函数即可。

function a(arg) {
  b(arg);
}
于 2013-05-30T17:55:42.057 回答
3

不可能“通过范围”或类似的东西。函数的作用域是在创建函数时确定的,所以只有在定义的arg地方存在才可以访问b

如果arg是 的一部分this,那么您可以使用 来执行此操作call,即使thisin与它在b其中的相同(当然,这将修改实际引用的任何内容,这可能会产生您可能不希望发生的副作用)。thisathis

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

function b () {
    console.log(this.arg);
}

另一种方法是将参数b作为实际的函数参数传递给。您可以使用以下方法访问函数的所有参数arguments

function b () {
    console.log(arguments);
}
于 2013-05-30T17:56:59.790 回答
1

试试这个:

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

function b() {
    alert(arguments);
}
于 2013-05-30T17:55:00.763 回答
0

我猜问题出在 b() 上。没有定义“arg”参数。尝试:
function b(arg) { alert(arg); }

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

现在它运行

(更新:调用需要参数(上下文 functionarg1,functionarg2...))

于 2013-05-30T17:58:01.603 回答
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是上下文对象,与作用域不同。

于 2013-05-30T18:03:48.110 回答
-2

假设由于某些原因您无法修改 的主体b,您可以尝试以下操作:

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

演示

于 2013-05-30T18:01:27.770 回答