js中for循環this的使用


隨着對js的深入學習和使用,你會發現它里面包含了很多令人困惑的機制,比如對象、閉包、原型鏈繼承等等

  1、this是啥?

  簡言之,this是JavaScript語言中定義的眾多關鍵字之一,它的特殊在於它自動定義於每一個函數域內,但是this倒地指引啥東西卻讓很多人張二摸不着頭腦。這里我們留個小懸念,希望看完這篇文章了你能回答出來this到底指引個甚。

  2、this有啥用?

  那邊觀眾又該為了,既然this這么難以理解,那么為個甚還要用它呢?在for循環中,什么時候使用This.指向和不使用this呢?

  通俗來講:this就是誰調用,this的指向就是誰。  在JS中萬物皆對象。

  舉個例子:踢足球的時候,球進對方的門,看誰最后碰到球,我方球員射門的那一腳踢到了門柱,反彈給對方球員進門,就是烏龍球。

 

- 在obj對象中定義一個函數,叫fun,這個是obj的屬性:

 1         var a = 888;
 2         var obj = {
 3             a: 100,
 4             fun: function() {
 5                 //如直接對象打點調用函數:此時彈出100,說明函數上下文是obj對象本身。
 6                 alert(this.a); //100
 7             }
 8         }
 9         obj.fun();
10         但如果這個函數被一個變量接收( 讓變量直接指向這個對象的方法)
11         var fn = obj.fun;
12         fn(); //這個叫()直接運行(他的this指向就是window了)

 

- 在IIFE中直接調用,里面的this指向都是window。

IIFE模式 (function(){})() 就是所謂的自執行體。

1
var a = 888; 2 var obj = { 3 a : 100, 4 b : (function(){ 5 alert(this.a); 6 })() 7 } 8 obj.b; //888
//這里的this指向都是window 因為var 申明變量是掛靠在window對象下的。

 

- 在定時器中直接調用,里面的this指向也是window。

1     var a = 100;
2     function fn(){
3     console.log(this.a++);
4    }
5   setInterval(fn,1000) //這里的this指向都是window 因為定時器是掛靠在window對象下的。

 

- 注意臨門一腳誰踢的,是誰最終調用那個函數,比如:

 

 1 var a = 100;
 2 var obj = {
 3    a : 200,
 4    fn : function(){
 5        console.log(this.a++);
 6    }
 7 }
 8 setInterval(obj.fn, 1000); //obj.fn沒有()執行,是定時器調用的
 9 
10 var a = 100; 11 var obj = { 12 a : 200, 13 fn : function(){ 14 console.log(this.a++); 15 } 16 } 17 setInterval(function(){ 18 obj.fn(); //obj.fn()直接調用,上下文的this是obj 19 }, 1000);

 

 

 

- call()和apply()設置函數的上下文並確定this指向。

call和apply作用都一樣,有兩個作用:

相同:
1、執行fun函數
2、改變fun函數的this指向

區別:

1、區別在於函數傳遞參數的語法不同

     call需要用逗號隔開羅列所有參數。

   apply是把所有參數寫在數組里面,即使只有一個參數,也必須寫在數組中。

 

舉例:

比如有一個函數叫變性函數(bianxing),它能夠將自己上下文的sex屬性改變。
此時小明對象(xiaoming),迫切要變性,xiaoming就成為bianxing的上下文:

 1 function bianxing(){
 2    if(this.sex == '男'){
 3        this.sex  = '女'
 4    }else{
 5        this.sex  = '男'
 6    }
 7  }
 8    var xiaoming = {
 9    name : "小明",
10    sex  : "男",
11    // bianxing : bianxing
12 }
  //對象內加上屬性變性//bianxing:bianxing 我們可以下面直接打點調用。
13 // xiaoming.bianxing()
//也可以用call或者apply改變this指向。
14 bianxing.call(xiaoming); 15 bianxing.apply(xiaoming); 16 console.log(xiaoming) 17 18 //call和apply方法幫我們做了兩件事: 20 // 調用bianxing函數 21 //改變bianxing函數的this指向為xiaoming

 

 

//圖片

 1 <ul>
 2 <li class="active"><img src="img/1.jpeg"/></li>
 3 <li><img src="img/2.jpeg"/></li>
 4 <li><img src="img/3.jpeg"/></li>
 5 <li><img src="img/4.jpeg"/></li>
 6 <li><img src="img/5.jpeg"/></li>
 7 </ul>
 8 
 9 //獲取按鈕 圖片
10 
11 var ul_lis = document.getElementsByTagName("ul")[0].getElementsByTagName("li");
12 for(var i=0;i<ol_lis.length;i++){
13 //給每一個li定義一個自定義屬性名為index
14 ul_lis[i].index = i;
15 
16 //點擊事件
17 ol_lis[i].onclick = function(){
18 for(var j=0;j<ol_lis.length;j++){
19 
20 //清空原來的圖片
21 ul_lis[j].className = "";
22 }
23 //點擊哪個獲得哪張圖片
24 this.className = "active";
25 }

 

因為i的值在每次循環的時候並不會被鎖定,而當我們點擊的時候(這動作是在循環完成后進行的,此時的i代表的是元素的總個數的值)。

我們還可以使用IIFE來執行。

 

 

總結:

綜上所述:
1.var、 setInterval、IIFE等都是掛靠在window對象下的 所以 this指向都是window(包括Math)。

2. 要明確this指向,執行時必須要打點 調用 (obj.fn())。

3.要直接在對象外使用this,必須要在對象里面添加對應的屬性與屬性值(鍵值對)。

4.改變this指向可以使用call和 apply。

以上就是關於JS this指向的內容介紹,希望對大家的學習有所幫助。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM