Javascript 使用.call()/.apply()时函数参数存在于何处?

Javascript 使用.call()/.apply()时函数参数存在于何处?,javascript,Javascript,我遇到一种情况,需要使用.call或.apply调用另一个函数,如下所示: function b() { alert(arg); } function a(arg) { eval("("+ b.toString() +")()"); } 然后 函数b被调用,但没有访问arg的权限。没关系,我可以通过范围。。是吗 function a(arg) { b.call(this); } a(123); 仍然没有-我无法从函数b访问arg。我怎么做 更新: 我不想修改b函数:-请尝试此

我遇到一种情况,需要使用.call或.apply调用另一个函数,如下所示:

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

函数b被调用,但没有访问arg的权限。没关系,我可以通过范围。。是吗

function a(arg) {
  b.call(this);
}
a(123);
仍然没有-我无法从函数b访问arg。我怎么做

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

请尝试此函数:

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

function b() {
    alert(arguments);
}
试试这个:

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

function b() {
    alert(arguments);
}

您仍然需要通过单独调用或作为数组应用来传递参数:

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

// or

function a(arg1,arg2) {
    return b.apply(this,arguments);   // The magical 'arguments' variable
}
当然,关于您的情况,没有任何建议实际使用call或apply:只需自己调用函数即可

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

您仍然需要通过单独调用或作为数组应用来传递参数:

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

// or

function a(arg1,arg2) {
    return b.apply(this,arguments);   // The magical 'arguments' variable
}
当然,关于您的情况,没有任何建议实际使用call或apply:只需自己调用函数即可

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

“传递范围”或类似的东西是不可能的。函数的作用域是在创建函数时确定的,因此它只能在定义了b的地方访问arg

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

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

function b () {
    console.log(this.arg);
}
另一种方法是将参数作为实际函数参数传递给b。可以使用参数访问函数的所有参数:

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

“传递范围”或类似的东西是不可能的。函数的作用域是在创建函数时确定的,因此它只能在定义了b的地方访问arg

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

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

function b () {
    console.log(this.arg);
}
另一种方法是将参数作为实际函数参数传递给b。可以使用参数访问函数的所有参数:

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

我猜问题出在b。没有定义“arg”参数。尝试: 函数barg{alertarg;} 及

现在它运行了


更新:调用需要参数上下文functionRG1、functionRG2

我猜问题出在b。没有定义“arg”参数。尝试: 函数barg{alertarg;} 及

现在它运行了


更新:调用需要参数上下文functionRG1、functionRG2

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

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

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

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

调用b时未能传递参数

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

function a(arg1,arg2) {
    return b.call(this,arg1,arg2);
}
Function::apply允许您以数组形式传递任意数量的参数:

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

// or

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

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

调用b时未能传递参数

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

function a(arg1,arg2) {
    return b.call(this,arg1,arg2);
}
Function::apply允许您以数组形式传递任意数量的参数:

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

// or

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


这是上下文对象,与作用域不同。

可能重复的在去任何地方之前,第一行应该是:function barg{@meagar我不是在要求区别。@Joey Twiddle根据更新,我不想修改b函数。我希望解决方案优雅且不费吹灰之力:那么你应该接受工程师的答案!如果你的b函数不接受任何参数,使用call或apply将正确的参数传递给b没有多大用处。可能的d在去任何地方之前,你的第一行应该是:function barg{@meagar我不是在要求区别。@Joey Twiddle根据更新,我不想修改b函数。我希望解决方案优雅且不费吹灰之力:那么你应该接受工程师的答案!如果你的b函数不接受任何参数,使用call或apply将正确的参数传递给b没有多大用处。我希望如此meone将解释为什么我应该假设arg和参数对于OP是同一件事。它们不一样,OP也不意味着我怀疑OP是否知道参数。虽然您的代码在arg可用的范围内执行OP想要的操作,但使用eval不应该是一个选项。@poke只有OP知道应该是什么n选项和什么不应该。@poke如果OP不能修改b的主体该怎么办?有趣。使它在不必修复b函数的情况下工作!我希望,有人会解释为什么我应该假设arg和参数对于OP是相同的。它们不一样,OP也不意味着我怀疑OP甚至知道参数。而你的code做OP想要的事情,在arg可用的范围内评估b,使用eval不应该是选项。@只有OP知道什么应该是选项,什么不应该。@poke如果OP可以的话怎么办
“不要修改b的主体?有趣。使其工作而不必修复b函数!添加上下文后,此调用将运行-抱歉,根据更新,我真的不想修改函数b:添加上下文后,此调用将运行-很抱歉,根据更新,我确实不想修改功能b: