1. 程式人生 > >this指標在普通函式、物件方法、定時器、建構函式、事件函式、call()、apply()中的執行

this指標在普通函式、物件方法、定時器、建構函式、事件函式、call()、apply()中的執行

前導: this是JavaScript中的一個關鍵字,在不同的場景中,this指向的物件也不同。在其他面嚮物件語言中(如C#),this就是指向當前物件。而在JavaScript 中this是在程式碼執行時繫結的,相對而言this指向比較混亂。在程式碼執行時this可以指向window物件,也可以指向當前呼叫物件,還可以指向其他物件。
Javascript呼叫函式有以下方式:普通函式、物件方法、定時器、建構函式、事件函式、call()/apply(),下面分別分析this在以上函式中的指向
1.this在普通函式中的指向

  //1.在普通函式中this指向
        var name = "張三"
; function demo(){ var name = '李四';//在函式內部定義並宣告的變數是區域性變數 console.log(this.name); //張三 } demo(); //其實這也可以看做是window.demo(),只不過我們在平常寫程式碼的時候會自動忽略掉。 //所以window是函式的呼叫者,this指向window,this下name屬性的值就是全域性變數,所以輸出的 //是全域性變數 張三,而不是區域性變數 李四

2.this在定時器中指向

setInterval(function
(){
var a = 12; alert(this.a); },1000) //undefined ,歸其本質setInterval方法也屬於window,因為window物件下沒有a屬性,所以 //瀏覽器會每隔一秒彈出值為undefined的提示框 這個案例也很好玩 function Demo(){ this.a = 12; setInterval(this.show,1000); } Demo.prototype.show = function
(){
alert(this.a); } var demo = new Demo(); demo.show(); //第一次彈出12,之後每隔一秒彈出undefined //原因在this.show代表了Demo.prototype.show的函式體,this指向Demo,所以第一次彈出12; //之後延遲定時器開始工作,定時器時鐘到達之後this指向window,window下沒有a屬性,所以每隔一秒彈出undefined

3. this在物件方法中的指向

            name : '張三',
            sayHi : function(){

                alert(this.name);
            }
        }

        var demo = obj.sayHi();
        demo();//張三,如果一個物件中的方法有this,那麼上一級呼叫這個方法時,this將指向上一級的物件

4.this在建構函式中的指向

//4.this在建構函式中的指向
        function Person(name,age){
            this.name = name;
            this.age = age;
            function sayHi(){
                alert('hello');
            }
            return sayHi;
        }

        var per = new Person('張三',14);
        console.log(per);//new關鍵字在記憶體中開闢了新的記憶體空間,並返回首地址的值,並將this指標指向了這塊
        //剛開闢的記憶體空間上,輸出結果是person物件。但是如果取消return註釋,輸出值為sayHi函式體,原因如下:
        //如果建構函式又返回的值的話,JS引擎會分析返回值的型別,如果返回值型別為Number()、字串等基本型別,
        //則不會替代new所建立的物件,如果返回值是引用型別,則將替換new創建出來的物件,因為new創建出來的物件
        //也是引用型別,JS引擎無法分辨,將new替換。

輸出列印
5.this在事件函式中的指向

<body>
    <button id="btn">點選</button>
</body>
<script>
    var btn = document.querySelector('#btn');
        btn.onclick  = function(){
            function fn(){
                alert(this); //彈出window,如果事件函式中還有其他函式存在,那麼this指向window
                //如果想要修改this的指向,可以使用一下兩種方法

            }
            fn();
        }
</script>

解決方法:

<body>
    <button id="btn">點選</button>
</body>

<script>
    var btn = document.querySelector('#btn');
        btn.onclick  = function(){
            var _this = this; //將this指標賦值給一個變數
            function fn(){
                alert(_this);//指向button物件

            }
            fn();
        }
</script>
<body>
    <button id="btn">點選</button>
</body>

<script>
    var btn = document.querySelector('#btn');
        btn.onclick  = function(){
            function fn(){
                alert(this);//指向button物件

            }
            fn.call(this);//call()改變this的指向
            //call()方法裡面需要兩大類引數,第一類引數是要修改指標指向的引數,只能有一個引數,並且只能放在第一個位置,第二類引數是函式中需要傳參的引數。如果函式不需要傳參,則只需要寫第一類引數;//apply()同理,但是引數的存放形式不同,引數必須放在[ ]裡面

        }
</script>

相關推薦

this指標普通函式物件方法定時建構函式事件函式call()apply()執行

前導: this是JavaScript中的一個關鍵字,在不同的場景中,this指向的物件也不同。在其他面嚮物件語言中(如C#),this就是指向當前物件。而在JavaScript 中this是在程式碼執行時繫結的,相對而言this指向比較混亂。在程式碼執行時th

詳解this指標--為什麼空的物件指標可以呼叫成員函式

引題 class A{ public: void function() { cout << "I can run" << endl; } }; int main() { A* pa =

黑馬程式設計師--OC基礎--類方法物件方法和self的使用

1、類方法 (1)類方法就是一個方法,它的使用不需要使用者去建立一個類的例項進行呼叫而可以直接通過類名對方法進行呼叫。 宣告一個類方法的格式: +(返回值型別) 方法名:(引數1型別)引數1名稱 方法名:(引數2型別)引數2名稱; 例:

python --類方法物件方法靜態方法

1、我們已經討論了類/物件可以擁有像函式一樣的方法,這些物件方法與函式的區別只是一個額外的self變數 # -*- coding:utf-8 -*- #!/usr/bin/python # Filename: method.py class Person:     grade=1     def __ini

jQuery 筆記 —— $.each$().each方法 與 選擇過濾寫法

一、$.each 與$().each 簡單區別: $.each 引數可對任意物件進行操作,$().each 可見是對選擇器所選的元素進行操作。 原理: 是通過call 與apply 方法實現的。 $.

根據字串名稱動態呼叫Python的函式物件方法

#!/usr/bin/python #coding: UTF-8 """ @author: CaiKnife 根據函式名稱動態呼叫 """ def do_foo(): print "foo!" def do_bar(): print "bar!" c

動態呼叫Python的函式物件方法以及屬性

def do_foo(): print "foo!" def do_bar(): print "bar!" class Print(): def __init__(self): self.x = 1; def

使用AlarmManager啟動廣播服務頁面(Android定時

     AlarmManager是Android中的一種系統級別的提醒服務,它會為我們在特定的時刻廣播一個指定的Intent。而使用Intent的時候,我們還需要它執行一個動作,如startActivity,startService,startBroadcast,才能使I

NSTimerCADisplayLinkGCD 三種定時的用法

在軟體開發過程中,我們常常需要在某個時間後執行某個方法,或者是按照某個週期一直執行某個方法。在這個時候,我們就需要用到定時器。 在iOS中有很多方法完成定時器的任務,例如 NSTimer、CADisplayLink 和 GCD都可以。 一、NSTimer 1. 建立

Spring 定時配置 基於配置檔案 (使用 Spring3.2 quartz-1.6.5)

Spring 配置檔案  quartz-1.6.5.jar <!-- time start --> <bean id="quartzJob" class="com.anubi

SysTick定時應用之一——用於延時函式

SysTick為簡單的向下計數的24位計時器,可以使用處理器時鐘或外部參考時鐘(通常是片上時鐘源)。當不使用OS時,SysTick定時器可以用作簡單的定時器外設,用以產生週期性中斷、延時或者時間測量。 用於延時函式的話比較簡單,SysTick定時器操作存在4個暫存器 Sy

jquery 定時 每隔15秒呼叫函式

var AlarmInfo = {     alarm_Timer: null,     //請求資料     FunQqbjxx2: function () {         console.log(獲取資料);    }, } 啟動定時器【每隔15秒呼叫 Alar

Matlab 定時或串列埠回撥函式繪圖時彈出新視窗的問題

原文連結: http://www.ilovematlab.cn/thread-55768-1-1.html 宣告:本文完全轉自Matlab論壇liuhuanjinliu的帖子。 本總結意在解決如下問題:利用定時器回撥函式或串列埠回撥函式在GUI指定的axes上繪圖時,曲線

靜態成員函式this指標物件指標和動態物件使用小結

·靜態成員函式就是使用static 關鍵字宣告的成員函式  在類外實現時不加static關鍵字,只有在類內宣告時才加static·靜態成員函式是類的一部分,作用是為了處理靜態資料成員  沒有this指標·靜態成員函式可以直接訪問該類的靜態成員,但不能直接訪問類中的非靜態成員·若想在靜態成員fun中使用非靜態成

Day40this指標和常函式解構函式物件的建立和銷燬過程拷貝構造和拷貝賦值(深拷貝淺拷貝!)

一、            this和常函式 1、 this 指標 1)     類中的建構函式和成員函式都隱藏一個該類型別的指標引數,引數名為this。 2)     對於普通的成員函式,this指標就是指向呼叫該函式的物件 3)     對於建構函式,this指標指向正

物件指標this指標和智慧指標

物件指標 指向的是一個物件,定義形式為: *類名 物件指標名; 那如何通過指標訪問物件成員呢? 物件指標名->成員名 例:使用指標來訪問Point類的成員 #include using namespace std; class Point { public: Point(in

python 學習 檔案開啟模式及物件方法(osos.path模組關於檔案/目錄常用的函式使用方法

os.getcwd() ‘C:\Users\劉曉宇\AppData\Local\Programs\Python\Python37-32’#查詢當前目錄 os.chdir(‘E:\’)#更改當前目錄 os.getcwd() ‘E:\’ o

1 python 函式陣列物件的使用方法

目錄 1 函式 2 陣列 3  物件 1 函式 # 我們將函式視為機器,接受輸入,做一些工作,然後彈出輸出 # 案例: def avg(x,y):     print("first input is", x)    

JavaScript基礎總結深入(資料型別資料_變數_記憶體物件函式回撥函式this

資料型別 1、分類 JavaScript 資料型別分為兩大類,分別為:基本型別,又稱為值型別;物件型別,又稱為引用型別。 基本(值)型別 String:任意字元 Number:任意的數字 boolean: true/false undefined: undefi

Java第十五天學習筆記~常用物件API(Spring類特點建構函式常用方法

常用物件API-----Spring類 一、特點 字串是一個特殊的物件 字串物件一旦被初始化就不會被改變 package day15; public class StringDemo { public static void main(String[] args)