为什么函数的内容会加载,而不是函数调用时的函数?

时间:2011-05-18 23:13:34

标签: javascript jquery function scope call

我遇到了一个我正在调用的函数的问题(使用jQuery)。 我的问题是当我尝试在另一个函数中调用一个函数时,第一个函数没有被调用。但是,当我将失败函数的内容放入调用失败函数的函数时,代码执行正常。我会告诉你我在说什么:

$('form.register .submit').click(validateRegister);

function submitStart() {

    var $this = $(this);
    $this.parent().addClass('processing');

    var $processing = $('#processing');
    $processing.show();

    var $endNote = $this.parent().find('#endNote')
    $endNote.slideDown();

}

function validateRegister(){

    submitStart();

}

请参阅,当submitStart()的内容放入validateRegister()时,它们会执行代码。但是,当调用此代码中显示的函数时,它无法工作。我认为范围(至少据我所知)无济于事。

非常感谢任何帮助,谢谢!

5 个答案:

答案 0 :(得分:4)

您的预期this值已失去,因此submitStart可能会被调用,但无效。

这样做:

function validateRegister(){

    submitStart.call( this );

}

您可以通过submitStart方法调用.call()方法,该方法可在函数实例上使用。

.call()方法可让您在正在调用的函数中手动设置this的值。

因为你已经将validateRegister指定为处理程序,所以jQuery确保this的值是你的元素。但由于validateRegister正在调用另一个函数,因此它负责确保函数具有正确的this值。


请记住,当你调用这样的任何函数时:

someFunction();

...该函数中this的值将为window,除非您手动将其设置为其他值。

答案 1 :(得分:0)

var $this = $(this);正在返回窗口。

答案 2 :(得分:0)

这里的问题是this。当您使用validateRegister作为事件处理程序时,jQuery会自动确保this引用调度该事件的DOM元素。但是当你调用单独的函数时,范围没有正确设置,所以this可能引用window对象(这是在全局范围内引用this时的默认值)。要修复它,最简单的方法是将元素作为参数传递:

function submitStart(element) {

    var $this = $(element);
    $this.parent().addClass('processing');

    var $processing = $('#processing');
    $processing.show();

    var $endNote = $this.parent().find('#endNote')
    $endNote.slideDown();

}

function validateRegister(){
    // "this" is the DOM element
    submitStart(this);
}

正如@Andrew所说,您还可以使用this函数的the .apply() methodsubmitStart中设置submitStart的值。

答案 3 :(得分:0)

this将不再引用点击的元素,而是代表window。您可以更改submitStart,以便接受参数并将this传递给它。

答案 4 :(得分:0)

我认为您可能会遇到问题this不符合您的想法。

试试这个:

submitStart.call(this)