Javascript事件侦听根据匿名或命名函数的使用而有所不同

Javascript事件侦听根据匿名或命名函数的使用而有所不同,javascript,events,dom,Javascript,Events,Dom,我使用以下代码将一个文本区域的输入复制到另一个文本区域: /** * Copies the values entered into the old description * into the new description, until the user focuses * on the new description */ var DescriptionLinker = (function() { var elOldDescription, elNewDes

我使用以下代码将一个文本区域的输入复制到另一个文本区域:

/**
 * Copies the values entered into the old description
 * into the new description, until the user focuses 
 * on the new description
 */
var DescriptionLinker = (function() {
    var elOldDescription,
        elNewDescription,
        linkIsBroken;

    this.init = function() {
        console.log('Initializing DescriptionLinker');
        elOldDescription = document.getElementById("old-description");
        elNewDescription = document.getElementById("new-description");
        linkIsBroken = false;

        linkDescriptions();
        watchLinkBreak();
    }

    // Assigns values to 'this'
    var finalize = function() {
        this.elOldDescription = elOldDescription;
        this.elNewDescription = elNewDescription;
    }

    var linkDescriptions = function() {
        elOldDescription.addEventListener("keyup", linkListener(), false);
    }

    var unlinkDescriptions = function() {
        elOldDescription.removeEventListener("keyup", linkListener(), false);
    }

    var linkListener = function(){
        elNewDescription.value = elOldDescription.value;
    }

    var watchLinkBreak = function() {
        console.log("Watching for link break");
        elNewDescription.addEventListener("focus", function(){
            unlinkDescriptions();
        });
    }

    finalize();
    return this;
})();

DescriptionLinker.init();
代码可以工作,但是值不会出现在
中,直到我关注文本区域。如果我用相同的匿名函数替换对
linkerfunction()
的调用,则当我在
旧描述
中键入时,值会正确显示在
新描述
文本区域中。你知道为什么吗

为了澄清,以下操作正确:

var linkDescriptions = function() {
    elOldDescription.addEventListener("keyup", function(){ 
         elNewDescription.value = elOldDescription.value;
    }, false);
}
var unlinkDescriptions = function() {
    elOldDescription.removeEventListener("keyup", function(){ 
         elNewDescription.value = elOldDescription.value;
    }, false);
}

PS所有这一切的原因是从传统系统过渡:当然!当您传递一个已定义的函数来代替匿名函数时,您将省略
()
,否则此函数将在编译后立即被调用。所以,改变

lOldDescription.addEventListener("keyup", linkListener(), false);


当然!当您传递一个已定义的函数来代替匿名函数时,您将省略
()
,否则此函数将在编译后立即被调用。所以,改变

lOldDescription.addEventListener("keyup", linkListener(), false);


呃,您意识到
DescriptionLinker===window
不是吗?函数中分配给它的所有属性都被创建为全局对象的属性?也就是说,它们变成了全局变量?例如,
typeof window.init=='function'
.noooop,未实现。我知道有几种方法可以解决这个问题(双关语),即返回一个JSON对象,但是为什么
this
指的是全局对象?我以为它将由anon函数确定作用域。
这与作用域无关。它是一个局部变量,由函数的调用方式或用户设置。您没有将其设置为默认的全局(浏览器中的窗口)对象,或者在严格模式下未定义。好的,感谢您指出这一点,认识到我对Nower的误解,您意识到
DescriptionLinker===window
不是吗?函数中分配给它的所有属性都被创建为全局对象的属性?也就是说,它们变成了全局变量?例如,
typeof window.init=='function'
.noooop,未实现。我知道有几种方法可以解决这个问题(双关语),即返回一个JSON对象,但是为什么
this
指的是全局对象?我以为它将由anon函数确定作用域。
这与作用域无关。它是一个局部变量,由函数的调用方式或用户设置。您没有将其设置为默认的全局(浏览器中的窗口)对象,或者在严格模式下未定义。好的,感谢您指出这一点,现在意识到我错了什么