删除以避免递归

时间:2013-11-30 18:34:40

标签: javascript recursion

我一直在阅读“Javascript:Definitive Guid”一个例子让我感到困惑。为什么处理IE的代码需要“this.onpropertychange = null”以避免递归。递归将如何发生?为什么我们不需要以同样的方式处理与其他浏览器打交道的功能“upcase”?谢谢。

//Example 17-7. Using the propertychange event to detect text input
function forceToUpperCase(element) {
    if (typeof element === "string") element = document.getElementById(element);
    element.oninput = upcase;
    element.onpropertychange = upcaseOnPropertyChange;
    // Easy case: the handler for the input event
    function upcase(event) {
        this.value = this.value.toUpperCase();
    }
    // Hard case: the handler for the propertychange event
    function upcaseOnPropertyChange(event) {
        var e = event || window.event;
        // If the value property changed
        if (e.propertyName === "value") {
            // Remove onpropertychange handler to avoid recursion
            this.onpropertychange = null;
            // Change the value to all uppercase
            this.value = this.value.toUpperCase();
            // And restore the original propertychange handler
            this.onpropertychange = upcaseOnPropertyChange;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

因为当事件处理程序更改"值"属性,它会触发另一个" propertychange"事件。因此,只要第一个事件处理程序完成,浏览器就会立即再次调用它。

(它不是真的"递归"在这种情况下,它只是一个无限循环。)

第一个"简单"处理程序正在响应"输入"事件,并更新"值"财产不会触发其中之一。然而,它将触发一个" propertychange"事件,所以在那个处理程序中做同样的事情也不会有什么坏处。