2015-09-02 39 views
2

考慮片段:的onclick以JavaScript的window.onload

<head>  
     <script> 
      window.onload = function(){ 
       function callMe(){ 
        alert("Inside the function"); 
        this.value = "New Value";     
       } 
       document.getElementById("thisCall").onclick = callMe; 
      } 
     </script>  
    </head> 
    <body>   
     <input type="submit" id="thisCall" /> 
    </body> 

預期和按鈕上的文字是從提交到新值改變上述工作正常。

但爲什麼不下面的代碼片段工作,如果我做了輕微的修改?

 <script> 
      window.onload = function(){ 
       function callMe(){ 
        alert("Inside the function"); 
        this.value = "New Value";     
       } 
       //document.getElementById("thisCall").onclick = callMe; 
      } 
     </script> 

    </head> 
    <body>   
     <input type="submit" id="thisCall" onclick="callMe();"/>   
    </body> 

,我不明白爲什麼

Uncaught ReferenceError: callMe is not defined

是在控制檯的O/P?

+0

因爲callMe只在onload函數聲明的範圍內已知。 – skubski

回答

4

的函數聲明創建一個變量指向在當前範圍功能

在JavaScript中,每個函數都會創建一個新的作用域。

您在分配給onload的匿名功能範圍內創建callMe。這不是全球性的。

onclick事件處理程序不在上述匿名函數的範圍,所以變量是不可訪問。

+0

這意味着我需要在第二種情況下將函數callMe()移出onload函數。 –

+0

完全避免第二種情況,不使用'onclick'屬性。全局最好避免。最好避免使用''和'onclick'屬性在內部實現'width'。混合你的JS和HTML是最好的避免。 – Quentin

2

這是由於範圍。您的函數只存在於分配給window.onload方法的匿名函數的範圍內。該匿名方法知道該方法,因爲它在其範圍內定義並可以調用該方法,但該範圍外沒有任何方法可以。

這有道理嗎?

1

你的問題是,callMe()函數的聲明是在onload範圍內,因此是本地的它,它只是這個範圍內可見。

你必須把它外面所以這將是一個全球性的功能,並且可以看到外面,從外部接近:

function callMe(){ 
    alert("Inside the function"); 
    this.value = "New Value";     
} 


window.onload = function(){ 
     callMe(); 
     document.getElementById("thisCall").onclick = callMe; 
} 

編輯:

而這種代碼:

document.getElementById("thisCall").onclick = callMe; 

是工作,因爲它是在onload功能範圍,在功能callMe是定義裏面寫d。

而且如果你用onclick屬性使用它,因爲像說callMe()沒有在全球範圍內的認可,這就是爲什麼你有callMe is not defined那裏的原因,將無法正常工作。

+0

我看到按鈕文本僅在使用document.getElementById(「thisCall」)時發生更改。onclick = callMe;因爲在callMe()的情況下,這指的是callMe函數的實例,並且我沒有creted任何callMe函數的實例。 –

+0

是的,這是因爲代碼'document.getElementById(「thisCall」)。onclick = callMe'位於函數callMe定義的onload作用域中。 –

相關問題