1. 程式人生 > 程式設計 >JavaScript深入刨析this的指向以及如何修改指向

JavaScript深入刨析this的指向以及如何修改指向

目錄
  • this
    • 方法中
    • 物件中
    • 隱藏的this
    • 嚴格模式
    • 可以改變this指向

this

老規矩先看程式碼:

方法中

function test(){
    console.log(this);
}

在這裡插入圖片描述

物件中

Person={
  name:"張三",eat:function(){
      console.log(this)
  }
}

在這裡插入圖片描述

在方法中,this表示該方法所屬www.cppcns.com的物件。因為第一個是window上的方法,所以列印了window,而eat方法是Person方法,所以列印除了物件Person。

所以可以看出單獨在控制檯使用this, 表示全域性物件。

在這裡插入圖片描述

隱藏的this

在物件,可以提前宣告一個一個:

var Person1={
    name:"張三",age:18
}
var Person2={
    name:"李四",age:19
}

這樣寫會很麻煩,所以可以借鑑一下類的概念,可以這樣:

var Person=function(name,age){
    this.name=namhttp://www.cppcns.come,this.age=age
       
}
var Person1=new Person("張三",18);
var Person2=new Person("李四",19);

在這裡插入圖片描述

其實在new的時候隱藏了一個return this,如果不使用new的話,發現其沒有返回這個新建的物件。

在這裡插入圖片描述

那麼現在補全一下看:

var Person=function(name,age){
    this.name=name,this.age=age
    return this;
}
var Person1=new Person("張三",19);

在這裡插入圖片描述

這樣的話,甚至可以偽造一個this的效果:

var Person=function(name,age){
    var that={};
    that.name=name,that.age=age
    return that;
}
var Person1=new Person("張三",19);

在這裡插入圖片描述

嚴格模式

this在嚴格模式和非嚴格模式下有些神奇的情況

function test() {
  return this;
}

# 如果前面新增"use strict" 代表是嚴格模式
"use strict";
function test() {
  return this;
}

在這裡插入圖片描述

這個可以看出在非嚴格模式下函式中,函式的所屬者預設繫結到 this 上。所以可以打印出全域性,但是嚴格模式下函式是沒有繫結到 this 上,這時候 this 是 undefined。

可以改變this指向

先看程式碼

var Person=function(name,this.age=age,this.fun=function(){
         console.log("列印",this.name);
        }
}
var Person1=new Person("張三",18);
var Person2=new Person("李四",19);




在這裡插入圖片描述

可以看出this指向的window中的a的值而不是方法test中的值,但是有些關鍵字是可以修axTtIMPKxj改指向的。

在這裡插入圖片描述

可以看出方法前的物件是誰,呼叫的this就是誰,但是可以修改的比如使用關鍵字 call,apply,bind

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

看上面的話,可以看出call和apply兩個很像,而bind不會立即執行函式,需要帶()執行。

不過如果帶上引數的話,會發現call和apply還是不同的,但是其裡面都必須是物件才行,畢竟this這個指向就是物件

關鍵字 直接呼叫方法 引數
call 會自動執行使用的方法 都可以帶引數格式如下:obj1.obj1Fun.call( obj2,引數1,引數1 ………………);
apply 會自動執行使用的方法 都可以帶引數格式如下:obj1.obj1Fun.apply( [ obj2,引數1 ………………]); 對比call的引數其引數用 [ ] 包住
bind 不會自動執行使用的方法,需要後面+(),進行呼叫 都可以帶引數格式如下:都可以帶引數格式如下:obj1.obj1Fun.bind( [ obj2,引數1 ………………])(); 對比apply的引數是一樣的,只不過其需要後面+()才能呼叫

到此這篇關於深入刨析this的指向以及如何修改指向的文章就介紹到這了,更多相關JavaScript this指向內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!