我遇到过需要使用.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函数: - )
答案 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]);
}
当然,没有任何关于你的情况的建议实际上使用 call
或apply
:只需自己调用该函数。
function a(arg) {
b(arg);
}
答案 1 :(得分:3)
不可能“通过范围”或类似的东西。函数的范围是在创建函数时确定的,因此只有在arg
定义b
时才能访问arg
。
如果this
属于call
,那么您可以使用this
执行此操作,即使b
中this
的{{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)