亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

javascript函數(shù)的4種調用方式與this的指向

 更新時間:2023年05月06日 08:51:27   作者:白哥學前端  
本文主要介紹了javascript函數(shù)的4種調用方式與this(上下文)的指向,文中有詳細的代碼示例,感興趣的同學可以參考閱讀一下

javascript 中作用域鏈和 this(上下文)的指向是很容易混淆的,簡單的說就是:

  • 作用域鏈取決于函數(shù)聲明的位置,函數(shù)聲明之后,從函數(shù)內(nèi)部往外,一直到window,這就是它的作用域鏈,與函數(shù)調用位置無關;
  • this 指向函數(shù)調用時的對象,如果是獨立調用,那就是指向 window,與函數(shù)聲明的位置無關;

函數(shù)調用的方式有4種,this 也就有4種指向

  • 獨立調用:func(),函數(shù)獨立調用,this指向window,;
  • 方法調用:obj.func(),函數(shù)作為obj的一個方法(屬性)調用,this指向obj;
  • 構造函數(shù)調用:new Func(),如果在一個函數(shù)前面帶上 new 關鍵字來調用, 那么背地里將會創(chuàng)建一個連接到該函數(shù)的 prototype 的新對象,this指向這個新的對象;
  • call、apply、bind調用:func.call(obj,value1,value2);  func.apply(obj,[value1,value2]); func.bind(obj,value1,value2)();  func.bind(obj)(value1,value2); 動態(tài)改變 this 的指向 obj;

獨立調用和方法調用

全局環(huán)境中,this 默認指向到 window;

函數(shù)獨立調用(不論這個函數(shù)在哪調用),this 默認指向到 window;

當函數(shù)被作為對象的方法(對象的一個屬性)調用時,this 指向該對象;

函數(shù)只有調用了之后才有 this 的概念,不然它只是代碼而已,我們經(jīng)常把函數(shù)傳給一個變量,如果后面沒加括號,就只是傳了個函數(shù),而不是執(zhí)行結果;

<script type="text/javascript">
    console.log(this === window);//true  全局環(huán)境中,this默認指向到window

    function abc(){
        console.log(this === window);
    }
    abc();//true   函數(shù)abc獨立調用(不論這個函數(shù)在哪調用),this默認指向到window
    function outer(){
        function inner(){
            console.log(this === window);
        }
        inner();
    }
    outer();//true  函數(shù)inner獨立調用(不論這個函數(shù)在哪調用),this默認指向到window

    var o = {
        m: function(){
            return this;
        },
        n: function(){
            function test(){
                return this;
            }
            return test(); //函數(shù)test獨立調用(不論這個函數(shù)在哪調用),this默認指向到window
        }
    };
    console.log(o.m());//Object o{...}  當函數(shù)被作為對象的方法(對象的一個屬性)運行時,this指向該對象
    console.log(o.n());//Window{...}  函數(shù)test獨立調用,this默認指向到window
</script>

當函數(shù)被作為對象的方法調用時,可以使用 this 訪問自己所屬的對象,所以它能從對象中取值或對對象進行修改;

this 到對象的指向發(fā)生在調用的時候,如果函數(shù)沒有被調用,則不會更改對象的變量;

通過 this 可取得它們所屬對象的上下文的方法稱為公共方法;

<script type="text/javascript">
    var o = {
        a: 1,
        m: function(){
            return this;
        },
        n: function(){
            this.a = 2; 
            //當函數(shù)被作為對象的方法調用時,可以使用this訪問自己所屬的對象,所以它能從對象中取值或對對象進行修改。
            //this到對象的綁定發(fā)生在調用的時候。所以這里的函數(shù) n 如果沒有調用過,那么外部的 a 是不會被改變的
        }
    };
    console.log(o.m().a);//1
    o.n();
    console.log(o.m().a);//2
</script>

如果想訪問這個外部函數(shù)的 this 值,需要將 this 的值保存在一個變量里,內(nèi)部函數(shù)就可以通過作用域鏈找到這個變量。

<script type="text/javascript">
    var o = {
        m: function(){
            console.log(this); //{} 當函數(shù)被作為對象的方法(對象的一個屬性)運行時,this指向該對象
        },
        n: function(){
            console.log(this);//{}

            var that = this;  
            //如果想訪問這個外部函數(shù)的this值,需要將this的值保存在一個變量里,內(nèi)部函數(shù)就可以通過作用域鏈找到這個變量。

            function test(){
                console.log(this);//window
                console.log(that);//{}
            }
            return test(); //函數(shù)test獨立調用(不論這個函數(shù)在哪調用),this默認指向到window
        }
    };
    o.m();
    o.n();
</script>

構造函數(shù)調用

如果一個函數(shù)用 new 關鍵字調用,那么這個函數(shù)就是構造函數(shù),并且背地里會創(chuàng)建一個連接到該函數(shù)的 prototype 的新對象,this 指向這個新對象;

如果構造函數(shù)沒有形參,實例化的時候是可以不帶()的;如  var  a = Func; 或者  var a = Func(); 兩種都可以;

同時我們在構造函數(shù)的時候有個約定(不是規(guī)范),首字母大寫,以避免忘了寫new關鍵字或者在普通函數(shù)前面加new;

new 關鍵字的作用就是執(zhí)行一個構造函數(shù),并返回一個對象實例。使用 new 命令,它后面的函數(shù)的函數(shù)調用和普通函數(shù)調用就不一樣了,步驟如下:

  • 創(chuàng)建一個空對象,作為將要返回的對象實例;
  • 將空對象的原型 proto 指向構造函數(shù)的 prototype 屬性;
  • 將構造函數(shù)內(nèi)部的this關鍵字指向空對象;
  • 執(zhí)行構造函數(shù)內(nèi)部的代碼;

就是說 this 指向這個新對象,構造函數(shù)內(nèi)所有針對 this 的操作,都會發(fā)生在這個新對象上;

<script type="text/javascript">
    // 創(chuàng)建一個名為Person 的構造函數(shù),它構造一個帶有user 和age 的對象
    var Person = function (user,age) {
        this.user = user;
        this.age = age; 
    };

    // 構造一個Person 實例 ,并測試
    var shane = new Person ('shane',25);
    console.log(shane.user);//shane
    console.log(shane.age);//25
</script>

javascript 中構造函數(shù)是不需要有返回值的,可以認為構造函數(shù)和普通函數(shù)之間的區(qū)別就是:構造函數(shù)沒有 return 語句,普通函數(shù)可以有 return 語句;

構造函數(shù)使用 this 關鍵字定義變量和方法,當 this 遇到 return 的時候,會發(fā)生指向不明(調用結果不明)的問題:

  • return 返回的不是一個對象,this 還是指向實例(新對象),調用結果也還是新對象;
  • return 返回的是一個對象,this 就指向這個返回的對象,調用結果就是這個返回的對象;
  • return 返回的是 null,this 還是指向實例,調用結果也還是新對象;
<script type="text/javascript">
    var Person = function(){
        this.user = 'shane';
        return 
    }
    var shane = new Person;
    console.log(shane.user);//shane   return沒有返回值,this還是指向實例(新對象),調用結果也還是新對象;

    var Color = function(){
        this.red = 'red';
        return 'hello world';
    }
    var redColor = new Color;
    console.log(redColor.red);//red   return返回的是一個基本類型的字符串(原始值),this還是指向實例(新對象),調用結果也還是新對象;

    var Size = function(){
        this.size = 'big';
        return {};
    }
    var sizeBig = new Size;
    console.log(sizeBig.size);//undefined   return返回的是一個對象,this就指向這個返回的對象,調用結果就是這個返回的對象;
</script>

間接調用

通過 call()、apply()、bind() 方法把對象綁定到 this 上,叫做顯式綁定。對于被調用的函數(shù)來說,叫做間接調用

  • call、apply、bind三者的第一個參數(shù)都是this要指向的對象,
  • bind 只是返回函數(shù),還未調用,所以如果要執(zhí)行還得在后面加個();call、apply 是立即執(zhí)行函數(shù);
  • 三者后面都可以帶參數(shù),call 后面的參數(shù)用逗號隔開,apply 后面的參數(shù)以數(shù)組的形式傳入;bind則可以在指定對象的時候傳參,和 call 一樣,以逗號隔開,也可以在執(zhí)行的時候傳參,寫到后面的括號中;func.call(obj,value1,value2);  func.apply(obj,[value1,value2]); func.bind(obj,value1,value2)();  func.bind(obj)(value1,value2);
<script type="text/javascript">
    var add = function (a,b) {
        return a+b;
    }; 

    var arr = [2,3];

    var sum0 = add.apply(null, arr);//apply后面的參數(shù)以數(shù)組的形式傳入
    var sum1 = add.call(null,arr[0],arr[1]);//call后面的參數(shù)用逗號隔開
    var sum2 = add.bind(null,arr[0],arr[1]);//bind后面的參數(shù)可以和call一樣,用逗號隔開
    var sum3 = add.bind(null); //bind調用的時候也可以在執(zhí)行的時候傳參

    console.log(sum0);//5
    console.log(sum1);//5
    console.log(sum2);//function (a,b) {return a+b;};    bind只是返回函數(shù),還未調用,
    console.log(sum2());//5   所以bind調用的時候,如果要執(zhí)行還得在后面加個()
    console.log(sum3(arr[0],arr[1]));//5   bind調用的時候也可以在執(zhí)行的時候傳參
</script>

嚴格模式下

  • 在嚴格模式下,未指定環(huán)境對象而調用函數(shù),則 this 值不會轉型為 window。 除非明確把函數(shù)添加到某個對象或者調用 apply() 或 call(),否則 this 值將是 undefined;
  • 所以我們可以手動添加 window.函數(shù)(),將 this 指向 window;
<script type="text/javascript">
    'use strict' //嚴格模式
    function a(){
        console.log (this);  
    }
    a();//undefined
    //在嚴格模式下,未指定環(huán)境對象而調用函數(shù),則 this 值不會轉型為 window , this 值將是 undefined。 
    //除非明確把函數(shù)添加到某個對象或者調用 apply()或 call()使用對象冒充。

    window.a();//window
    //所以我們可以手動添加 window.函數(shù)(),來改變this指向window

    (function(){
        console.log(this);//undefined
    })();

    setTimeout(function(){
        console.log(this);//Window
    },0);
    //setTimeout是window的一個方法(屬性),所以這里可以寫成window.setTimeout
//所以不管是嚴格模式還是非嚴格模式,setTimeout里的this始終指向window
//但是有時候我們會發(fā)現(xiàn)setTimeout中的this也有其他情況,這只是誤導,當然如果你不確定的話,直接console.log(this)一下,分分鐘解決
</script>

以上就是javascript函數(shù)的4種調用方式與this的指向的詳細內(nèi)容,更多關于javascript函數(shù)調用與this指向的資料請關注腳本之家其它相關文章!

相關文章

  • 原生JS實現(xiàn)日歷組件的示例代碼

    原生JS實現(xiàn)日歷組件的示例代碼

    本篇文章主要介紹了原生JS實現(xiàn)日歷組件的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • JS通用方法觸發(fā)點擊事件代碼實例

    JS通用方法觸發(fā)點擊事件代碼實例

    這篇文章主要介紹了JS通用方法觸發(fā)點擊事件代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • uni-app h5端在jenkins構建報錯解決

    uni-app h5端在jenkins構建報錯解決

    這篇文章主要為大家介紹了uni-app h5端在jenkins構建報錯解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • js檢查是否關閉瀏覽器的方法

    js檢查是否關閉瀏覽器的方法

    這篇文章主要介紹了js檢查是否關閉瀏覽器的方法,涉及javascript針對窗口事件的判定與操作相關技巧,需要的朋友可以參考下
    2016-08-08
  • JavaScript簡介

    JavaScript簡介

    這篇文章主要介紹了JavaScript簡介,都是非?;A的內(nèi)容,有需要的小伙伴參考下吧。
    2015-02-02
  • 刪除條目時彈出的確認對話框

    刪除條目時彈出的確認對話框

    這篇文章主要介紹用js的confirm實現(xiàn)的刪除條目時彈出的確認對話框,詢問是否要刪除這條記錄,需要的朋友可以參考下
    2014-06-06
  • JavaScript NodeTree導航欄(菜單項JSON類型/自制)

    JavaScript NodeTree導航欄(菜單項JSON類型/自制)

    利用閑暇時間自己做了個JavaScript NodeTree,網(wǎng)上有很多類似的效果,本例主要是練練手,鞏固下知識,感興趣的朋友可以了解下,或許對你學習NodeTree導航欄有所幫助,認為好的就分享嘍
    2013-02-02
  • javascript實現(xiàn)html頁面之間參數(shù)傳遞的四種方法實例分析

    javascript實現(xiàn)html頁面之間參數(shù)傳遞的四種方法實例分析

    這篇文章主要介紹了javascript實現(xiàn)html頁面之間參數(shù)傳遞的四種方法,結合實例形式較為詳細的分析了JavaScript實現(xiàn)頁面之間參數(shù)傳遞的常用技巧,需要的朋友可以參考下
    2015-12-12
  • javascript 深拷貝

    javascript 深拷貝

    突然問起我以前的函數(shù),我也會愣一下,心想,真爛!我總是喜歡把最好的東西分享給大家的,以前的大家忘掉吧。
    2010-03-03
  • 漸變的Alert

    漸變的Alert

    漸變的Alert...
    2006-11-11

最新評論