1. 程式人生 > >大前端學習筆記整理【五】關於JavaScript中的關鍵字——this

大前端學習筆記整理【五】關於JavaScript中的關鍵字——this

寫在前面

工作有那麼一段時間了,但是在工作中,發現自己的理論知識還是有所欠缺。特別是在javascript上,很多東西其實自己屬於知道要用這個,但是不知道為什麼要這麼用...這種情況很是尷尬了,所以寫部落格的很重要一個目的就是鍛鍊我自己的總結能力,把學到的東西總結出來,感覺這樣能讓我更快的去理解所學到的東西。

◇ 關於javascript理論

剛開始做前端的時候還是以完成功能為主,所以忽略掉了理論知識的重要性,但是隨著工作的慢慢深入,發現很多原理還是要建立在對理論知識的理解與掌握上。

作為一個合格的前端工程師,這個確實有點不能忍...所以還是要沉下心來,一點點的去提升自己。話說回來,其實javascript的理論在我看來並沒有那麼的枯燥難懂,但是需要你去實驗、去除錯。興趣永遠是學習最好的動力,我想保持這份興趣,持續的去研究javascript的理論,去探尋其中的祕密和讓人驚歎的地方。

關於this

閒話扯了那麼多,希望各位看官不要在意...只是本人一點點心聲罷了...言歸正傳,關於this,其實在我看來確實算是javascript中很基礎、很重要、也是很難理解的一個點;

this的定義,藉助下阮一峰大大的總結,感覺比較好理解些:

this是Javascript語言的一個關鍵字。 它代表函式執行時,自動生成的一個內部物件,只能在函式內部使用。比如,
function test(){
  this.x = 1;
}
隨著函式使用場合的不同,this的值會發生變化。但是有一個總的原則,那就是this指的是,呼叫函式的那個物件。

this的指向

其實this之所以難以理解,主要就是在不同情況下,this的指向都是不一樣的。以下幾種情況,基本歸納了常見的this的指向:

1.在全域性程式碼或者普通的函式呼叫中,this指向全域性物件,在瀏覽器裡面既為window物件。
console.log(this);//輸出window 

function foo(){ 
    console.log(this); 
} 
foo();//輸出window
在瀏覽器環境裡執行上述程式碼,兩處輸出結果均為window物件。 2.通過call或apply方法呼叫函式,this指向方法呼叫的第一個引數。
var obj = {name:'test'}; 
function foo(){ 
    console.log(this); 
} 
foo.call(obj);//輸出obj 
foo.apply(obj);//輸出obj
call和apply的區別在於call的呼叫需要兩個引數,用逗號做分割,而apply只需要一個引數,這個引數必須是陣列; 插入的小知識點: 利用apply的特點實現不建立新的物件把兩個陣列拼裝成一個數組:
var arr1 = [1, 2 , 3], 
    arr2 = [4, 5, 6]; 
Array.prototype.push.apply(arr1, arr2); 
console.log(arr1);//輸出[1, 2, 3, 4, 5, 6]

call與apply的定義:

call方法: 

語法:call(thisObj,Object) 定義:呼叫一個物件的一個方法,以另一個物件替換當前物件。 說明: call 方法可以用來代替另一個物件呼叫一個方法。call 方法可將一個函式的物件上下文從初始的上下文改變為由 thisObj 指定的新物件。  如果沒有提供 thisObj 引數,那麼 Global 物件被用作 thisObj。  apply方法:  語法:apply(thisObj,[argArray]) 定義:應用某一物件的一個方法,用另一個物件替換當前物件。  說明:  如果 argArray 不是一個有效的陣列或者不是 arguments 物件,那麼將導致一個 TypeError。  如果沒有提供 argArray 和 thisObj 任何一個引數,那麼 Global 物件將被用作 thisObj, 並且無法被傳遞任何引數 3.呼叫物件的方法,this指向該物件。
var obj = {name:'test'};
 function foo(){ 
    console.log(this); 
} 
obj.foo = foo; obj.foo();//輸出obj
這個也就是所謂的誰呼叫,指向誰 4.構造方法中的this,指向新構造的物件。
function C(){ 
    this.name = 'test'; 
    this.age = 18; 
    console.log(this); 
} 
var c = new C();//輸出 c 
console.log(c);//輸出 c
執行以上程式碼後,控制檯輸出均為c所指向的物件。當new操作符用於函式時,會建立一個新物件,並用this指向它

特殊情況

上述四種情況基本概述了this的常見指向,但是也有些特殊的情況下,this的指向並不在上訴的範圍中:

a.bind方法

這個方法會建立一個函式例項,其this值會被繫結到傳給bind()函式的值。也就是說會返回一個新函式,並且使函式內部的this指向為傳入的第一個引數:

window.color = 'red';
var o = {color : 'blue'};
function sayColor(){
    alert(this.color)
}
var objectSayColor = sayColor.bind(o);
objectSayColor();//blue

b.eval

對於eval函式,其執行時候似乎沒有指定當前物件,但實際上其this並非指向window,因為該函式執行時的作用域是當前作用域,即等同於在該行將裡面的程式碼填進去。下面的例子說明了這個問題:

var name = "window";

var Bob = {
    name: "Bob",
    showName: function(){
        eval("alert(this.name)");
    }
};

Bob.showName();

總結

  • 預設的,this指向全域性物件
  • 當一個函式被作為一個父物件的屬性呼叫時,函式中的this指向父物件
  • 當一個函式被new運算子呼叫時,函式中的this指向新建立的物件
  • 當使用call或apply呼叫函式時,函式程式碼中的this被設定為call或apply中的第一個引數。如果第一個引數是null或不是個物件,this指向全域性物件。

其實除去上面的特殊情況,我們只要記住這四種情況,那麼對於this的指向應該就有一個較為清楚的認識。

博文中如有敘述不清或者錯誤,歡迎各位批評指正!完結撒花~

相關推薦

前端學習筆記整理rem與px換算的計算方式

前言 這段時間的小專案中算是真正意義上使用了rem來進行移動端的頁面佈局,專案結束了我反思了一下之前的對於rem的使用...原來我以前對rem用法完全是在搞笑啊!!結合這次這個小專案,我覺得我也有必要對rem佈局以及用法進行一次總結。 ps.文筆可能不太好... 1.什麼是rem 來自於鵝廠ISUX團隊的解釋

前端學習筆記整理關於JavaScript關鍵字——this

寫在前面 工作有那麼一段時間了,但是在工作中,發現自己的理論知識還是有所欠缺。特別是在javascript上,很多東西其實自己屬於知道要用這個,但是不知道為什麼要這麼用...這種情況很是尷尬了,所以寫部落格的很重要一個目的就是鍛鍊我自己的總結能力,把學到的東西總結出來,感覺這樣能讓我更快的去理解所學到的東西。

前端學習筆記整理行內元素與塊級元素的區別以及絕對定位與固定定位的差異

1.簡要說明: 1. 行內元素會再一條直線上,是在同一行的。比如span和strong; 2. 塊級元素各佔一行。是垂直方向的!比如div和p 假如你要將行內元素變成塊級元素,那麼就只需要在該標籤上加上樣式 display:block; 塊級元素可以用樣式控制其高、寬的值,而行內元素不可以。 行內元素和wi

前端學習筆記整理CSS盒模型與基於盒模型的6種元素居中方案

概覽 CSS盒模型,規定了元素框來處理元素的 內容、內邊距、邊框和外邊距的方式 元素部分是指內容部分,也是最實際的內容,包圍內容的稱之為內邊距,內邊距外圍是邊框,邊框外圍就是外邊距;且外邊距是透明的,所以並不會阻擋其後的元素   * {     margin: 0;     padding: 0;   }

前端學習筆記整理HTTP協議以及http與https的區別

前言 還是老樣子,新部落格開始前總是想先囉嗦幾句...HTTP協議其實在當初學習java時老師就有提過...但是...反正就那麼過去了... 這段時間公司的專案正好要求做https的轉換和遷移,然後自己思考了一下,好像自己對於http連一知半解都算不上...更不提http與https的區別...想想作為一個未

前端學習筆記整理CSS視覺格式化模型

1. 概念 在視覺格式化模型中,文件樹中的每個元素都將會根據盒模型產生零到多個盒子。這些盒子的佈局由如下因素決定: 盒子的尺寸和型別 定位策略(正常文件流,浮動或者絕對定位) 和文件樹中其他元素的關係 額外的資訊(比如視口的大小,圖片的原始尺寸等) 1.1 視口(viewport) 連續媒體(contin

前端學習筆記整理LESS基礎

第一次接觸CSS預編譯,然後對比後發現其實less的上手容易度確實比sass高不少,再加上公司專案也是使用的less。所以想想還是根據網上的各種教程,整理出來了一些比較基礎的、而且比較能讓我們這種初學者快速上手的例子。 菜雞一隻,程式碼要是有錯或者表達不清的地方,請各位批評指正! 那麼,現在我們就開始正文部分

前端學習筆記整理this關鍵字詳解

 這裡有一個微妙但是非常重要的細節,雖然 this 的繫結規則完全取決於呼叫位置,但是隻有 foo() 執行在非 strict mode 下時,預設繫結才能繫結到全域性物件;嚴格模式下與 foo()的呼叫位置無關: function foo() {      console.log( this.a );

前端學習筆記關於CSS再次整理

如果你在日常工作中使用 CSS,你的主要目標可能會重點圍繞著使事情“看起來正確”。如何實現這一點經常是遠不如最終結果那麼重要。這意味著比起正確的語法和視覺結果來說,我們更少關心 CSS 的工作原理。 CSS 的視覺結果通常是操作隱藏屬性的間接後果,你可能還沒有意識到這一點。某些 CSS 屬性(比如 backg

蝸龍徒行-Spark學習筆記IDEA叢集執行模式的配置

問題現象 在IDEA中執行sparkPI,報錯: Exception in thread “main” org.apache.spark.SparkException: A master URL must be set in your configurati

Python學習筆記5 轉載基本矩陣運算_20170618

ros class 簡單 lba spa 使用 常見 port 模塊 需要 numpy 庫支持 保存鏈接 http://www.cnblogs.com/chamie/p/4870078.html 1.numpy的導入和使用 from numpy import *;

學習筆記案例財政收入影響因素分析及預測模型

6.0 pearson end 4.5 pandas 問題 特征 ase max() 案例來源:《Python數據分析與挖掘實戰》第13章 案例背景與挖掘目標 輸入數據: 《某市統計年鑒》(1995-2014) 挖掘目標: 梳理影響地方財政收入的關鍵特征,分析、識別影響地

學習筆記案例中醫證型關聯規則挖掘

order 卡方檢驗 eat 業務 並行 pen fill lin 區分 案例來源:《Python數據分析與挖掘實戰》第8章 案例背景與挖掘目標 輸入數據: 挖掘目標: 借助三陰乳腺癌患者的病理信息,挖掘患者的癥狀與中醫證型之間的關聯關系 對截斷治療提供依據,挖掘潛性證素

Java基礎筆記整理---07面向物件程式設計-類和物件

int 型別預設值為 0 String型別預設值為null 方法(函式):返回值 方法名(引數型別 引數名稱, ...){方法體(程式碼塊)}this指呼叫的方法中(當前)的變數類與物件1.構造方法:1> 構造物件 構造例項的方法,一個特殊方法,方法名需要與類名相同,

linux學習筆記整理

支持 沒有 賬號 pmf linux 系統 tin 解決 mas chang 第六章 Centos7用戶管理本節所講內容:6.1 用戶和組的相關配置文件6.2 管理用戶和組6.3實戰:進入centos7 緊急模式恢復root密碼 用戶一般來說是指使用計算機的人,計算機對針使

Java學習筆記(十):import關鍵字

http 技術分享 import logs java學習筆記 .cn 關鍵字 blog ava Java學習筆記(十五):import關鍵字

學習筆記 第十JavaScript基礎

continue 分隔符 全部 scrip 允許 非循環 元素 當前 避免 第15章 JavaScript基礎 【學習重點】 了解JavaScript基礎知識 熟悉常量和變量 能夠使用表達式和運算符 正確使用語句 能夠掌握數據類型和轉換的基本方法 正確使用函數、對象、

makefileif語句

ifeq ifeq ($(DEBUG), 1) OPTS= -O0 -g else OPTS = -O2 endif ifneq ifneq ($(DEBUG), 1) OPTS = -O2 else OPTS= -O0 -g endif ifde

java入門java的char型別

char的初始化   char是Java中的保留字,與別的語言不同的是,char在Java中是16位的,因為Java用的是Unicode。不過8位的ASCII碼包含在Unicode中,是從0~127的。   但是English,Spanish,German, Fr

RegExpJavaScript正則表達式判斷匹配規則以及常用方法

返回 空字符串 tro true 正則表達式 str 本地 大小 表示範圍 字符串是編程時涉及到的最多的一種數據結構,對字符串進行操作的需求幾乎無處不在。 正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字