2010-07-17 45 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);