DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> JavaScript call apply使用 JavaScript對象的方法綁定到DOM事件後this指向問題
JavaScript call apply使用 JavaScript對象的方法綁定到DOM事件後this指向問題
編輯:關於JavaScript     
先來看看現象:
復制代碼 代碼如下:
<html>
<head>
<title>apply_and_call</title>
</head>
<body onload="init()">
<div id="testDiv" style="position: absolute; border: 1px solid gray; width:100px; height: 100px"></div>
<script type="text/javascript">
function init() {
var el = document.getElementById("testDiv");
var a = new classA(el);
}
function classA(el) {
this.a = 1;
this.container = el;
//綁定單擊事件
this.container.onclick = this.click;
}
classA.prototype = {
click:function() {
alert(this.a);
}
}
</script>
</body>
</html>

當單擊DIV後,彈出框顯示undefined。
原因是當DOM對象響應單擊事件後,事件方法中的this關鍵字指向的是DOM對象,此時DOM對象沒有a屬性,所以彈出undefined。
而程序員本意是響應事件方法中this指向的是classA的對象a,如何才能達到此目的?這就需要使用到call或apply方法。
下面再來熟悉下call方法:
摘要:
function.call(thisobj, args…)
參數:
thisobj
  調用function的對象。在函數主體中,thisobj是關鍵字this的值。
args…
  任意多個參數,這些參數將傳遞給函數function。
返回值:
調用函數function的返回值。
拋出:
TypeError
  如果調用該函數的對象不是函數,則拋出該異常。
描述:
call()將指定的函數function作為對象thisobj的方法來調用,把參數列表中thisobj後的參數傳遞給它,返回值是調用函數後的返回值。在函數體內,關鍵字this引用thisobj對象。
如果將指定數組作為傳遞給函數的參數,請使用Function.apply()方法。
熟悉call()方法後,將代碼1修改如下:
代碼2:
復制代碼 代碼如下:
<html>
<head>
<title>apply_and_call</title>
</head>
<body onload="init()">
<div id="testDiv" style="position: absolute; border: 1px solid gray; width:100px; height: 100px"></div>
<script type="text/javascript">
function init() {
var el = document.getElementById("testDiv");
var a = new classA(el);
}
function classA(el) {
this.t = 1;
this.clickDele = createDele(this.click, this);
el.onclick = this.clickDele;
}
classA.prototype = {
click:function() {
alert(this.t);
}
}
function createDele(fun, obj, arg) {
return function() {
return fun.call(obj, arg);
}
}
</script>
</body>
</html>

代碼2 25行:主要添加了createDele方法,該方法包含三個參數:fun、obj、arg,分別是“要執行的方法”、“fun中this需要指向的對象”、“傳入fun中的參數”。該方法返回一個匿名方法。
匿名方法負責執行fun方法,同時將fun中的this指向obj,並使用作為arg傳入參數,處理結果返回。
當程序執行走到第15行調用createDele方法,傳入對象的方法和對象本身,createDele接收參數後返回一個匿名方法,this.clickDele被設置成為返回的匿名方法,16行代碼將this.clickDele(匿名方法)綁定到DOM事件上,程序執行完畢,點擊DOM(DIV)觸發匿名方法,些時匿名方法中fun為之前傳入的this.click(即:方法a.click),obj為之前傳入的this(即:對象a),所以此時使用call方法使得this.click(即:方法a.click)中的this指向obj(即:對象a),最終彈出結果為1。結果正確,達到了程序的本意。
回顧匿名方法多少會讓人感到有些怪異:調用匿名方法時fun為什麼會是this.click(即:方法a.click)、obj什麼為是this(即:對象a)。這個問題就需要用JavaScript的閉包來解釋了,這裡暫不介紹閉包,後面會有介紹JavaScript閉包的文章發表,歡迎有興趣的朋友持續關注!
不管各位看官信還是不信,反正道理和程序是沒有問題的!:)
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved