2010-07-17 106 views
0

我'试图在“内”功能使用一些值从“上”功能:应用上的事件监听不起作用

function Load(el, script) 
{ 
    el.addEventListener('click', 
     function (e) 
     { 
      this.test = "testing"; 
      script.apply(this, arguments); 
     }, false); 
}; 

Load(document.getElementById("panel"), 
    function (e) 
    { 
     alert(test); // test is undefined 
    }); 

上面的例子不工作,它说:test未定义。

但以下几项工作:

function A(B) 
{ 
    this.test = "bla"; 
    B.apply(this); 
} 
function B() 
{ 
    alert(test); 
} 
A(B); 

有什么区别?我怎样才能使它正常工作?

回答

3

test是该点处的元素上的属性,所以你需要引用它像:

Load(document.getElementById("panel"), 
function (e) 
{ 
    alert(this.test); // "testing" 
}); 

You can test it here。不同的是,在第一个示例中,this指的是id="panel"元素,并且在那里设置了属性。在第二个示例中,this引用全局对象或window,因此test是一个全局变量,在您访问它时会起作用。

+0

嗯谢谢!有没有办法让我不用'this.'来引用'test'? – BrunoLM 2010-07-17 03:20:08

+0

@BrunoLM - Nope ...你必须有一些上下文,除非它是一个全局变量或局部变量(并且它不在处理程序中),你需要从它所在的对象引用它。 – 2010-07-17 03:21:34

+0

我明白了。再次感谢! – BrunoLM 2010-07-17 03:22:46

1

在第二个示例中,当您拨打A()时,this引用window对象,因为这是运行A()的范围。所有全局变量也属于window对象,所以在这种情况下,test,this.testwindow.test都是相同的实体。

在第一个例子,但是,this是指在其上的处理程序被称为元件,所以this.test(其被定义)是一样的,但"#panel".testtestwindow.test(未定义)不同。

0

你应该接受尼克Craver的答案,我只是澄清这里与更多的代码:

function Load(el, script) 
{ 
    el.addEventListener('click', 
     function (e) 
     { 
      this.test = "testing"; // sets el.test="testing" ('cos this==el) 
      script.apply(this, arguments); 
     }, false); 
}; 

Load(document.getElementById("panel"), 
    function (e) 
    { 
     alert(test); // alerts window.test, not el.test 
    });
function A(B) 
{ 
    this.test = "bla"; // sets window.test="bla" ('cos this==window) 
    B.apply(this); 
} 
function B() 
{ 
    alert(test); // alerts window.test 
} 
A(B);