好比小題目:數組
function fun(){函數
var a = 888;this
alert(this.a); //實際上訪問的是window.a對象
}索引
var a = 666;事件
fun(); //彈出666get
函數function fun(){}的上下文是什麼!不要看它怎麼定義,要看它怎麼調用!!此時是fun()函數名加上圓括號直接調用,此時上下文就是window對象!io
而咱們知道:全部的全局變量都是window對象的屬性,(注意:函數裏面的局部變量,不是window的屬性,不是任何東西的屬性,它就是一個變量!!) 程序彈出666.function
好比下面的例子,咱們把fun函數定義出來了,而後又把這個函數綁定給了obj對象的c屬性:變量
function fun(){
alert(this.a); //至關於彈出obj.a
}
//對象
var obj = {
"a" : 10,
"b" : 20,
//給這個對象增長一個方法,值就是fun函數
"c" : fun
}
//咱們要看清楚函數執行的時候,是怎麼執行的!!
//如今不是圓括號直接執行!!而是一個對象打點調用這個函數執行,因此函數的上下文是obj對象!!!
obj.c(); //彈出10
調用的時候,是
對象.函數()
此時根據規律,函數裏面的this是這個對象。因此可以彈出10。
下面咱們定義了一個fun,而後把這個fun當作了3個DOM元素的事件處理函數:
//函數
function fun(){
this.style.background = "red";
}
var box1 = document.getElementById("box1");
var box2 = document.getElementById("box2");
var box3 = document.getElementById("box3");
// 把同一個函數綁定給不一樣的對象
// this就是點擊誰就是誰
box1.onclick = fun;
box2.onclick = fun;
box3.onclick = fun;
函數不會執行,直到用戶點擊了某一個div標籤。此時點擊誰,this就是誰。
//函數
function fun(){
alert(this.a);
}
var a = 888;
setInterval(fun,1000);
函數fun被定時器調用,此時函數的上下文就是window對象。每秒鐘能彈出888.
作一個小例子吧,點擊一個盒子,2秒鐘以後變紅:
小明同窗寫的程序是錯誤的:
var box1 = document.getElementById("box1");
box1.onclick = function(){
setTimeout(function(){
this.style.background = "red";
},2000);
}
這是由於我標藍色的函數的最終調用者是定時器!因此函數的上下文是window對象。window對象沒有背景顏色屬性。
怎麼辦?備份this!備份上下文!
在定時器外面的事件處理函數中,this就是box1這個元素,此時咱們能夠備份上下文。把this存爲局部變量self,後面的程序就用self指代box1。還能夠用_this、that等等,咱們一概使用self。
var box1 = document.getElementById("box1");
box1.onclick = function(){
var self = this;
setTimeout(function(){
self.style.background = "red";
},2000);
}
好比:
function fun(){
alert(this === arr); //true
alert(this.length); //3,由於數組的長度是3
}
var arr = [fun,"東風","五條"];
arr[0]();
必定要敏感:
arr[0]();
此時這個函數是從數組中枚舉出來而後加圓括號執行的,因此最終調用者能夠認爲是這個數組,上下文就是這個數組。