用“this”调用函数

时间:2008-11-28 03:01:54

标签: javascript

我有一个< a>的onclick处理程序element(实际上,它是一个jQuery创建的处理程序,但这并不重要)。它看起来像这样:

function handleOnClick() {
    if(confirm("Are you sure?")) {
        return handleOnClickConfirmed();
    }
    return false;
}

通过此功能,对象可以作为< a>进行访问。元素点击。但是,handleOnClickConfirmed的 this 是一个Window元素!我希望handleOnClickConfirmed与handleOnClick具有相同的 this 。我该怎么做?

(我知道我可以将这个作为handleOnClickConfirmed的参数传递,但是我的一些代码已经使用了handleOnClickConfirmed而且我不想重写那些调用。此外,我认为使用< strong>这个看起来更干净。)

2 个答案:

答案 0 :(得分:26)

以下应该这样做:

function handleOnClick() {
    if( confirm( "Sure?" ) ) {
        return handleOnClickConfirmed.call( this );
    }
    return false;
}

附加到Function个对象的call()函数旨在允许此操作;调用具有所需上下文的函数。在设置回调到其他对象中的函数的事件处理程序时,这是一个非常有用的技巧。

答案 1 :(得分:11)

Rob的回答是你问题的最佳答案,但我想解决你在原始问题中所写的内容:

  

我知道我可以将此作为handleOnClickConfirmed的参数传递,但我的一些代码已经使用了handleOnClickConfirmed,我不想重写这些调用。

就解释器而言,JavaScript参数始终是可选的。例如,如果你有这个功能:

function MyFunction(paramA, paraB) {
  // do nothing
}

所有这些调用都会毫无错误地执行:

MyFunction(1,2);
MyFunction(1);
MyFunction();

因此,您可以修改handleOnClickConfirmed以接受本质上是可选参数的内容。像这样:

function handleOnClickConfirmed(context) {
  context = context || this;
  // use context instead of 'this' through the rest of your code
}

同样,在这种特殊情况下,呼叫功能是最佳解决方案。但是我在上面概述的技术在您的工具箱中是一个很好的技术。