大前端學習筆記整理【五】關於JavaScript中的關鍵字——this
寫在前面
工作有那麼一段時間了,但是在工作中,發現自己的理論知識還是有所欠缺。特別是在javascript上,很多東西其實自己屬於知道要用這個,但是不知道為什麼要這麼用...這種情況很是尷尬了,所以寫部落格的很重要一個目的就是鍛鍊我自己的總結能力,把學到的東西總結出來,感覺這樣能讓我更快的去理解所學到的東西。
◇ 關於javascript理論
剛開始做前端的時候還是以完成功能為主,所以忽略掉了理論知識的重要性,但是隨著工作的慢慢深入,發現很多原理還是要建立在對理論知識的理解與掌握上。
作為一個合格的前端工程師,這個確實有點不能忍...所以還是要沉下心來,一點點的去提升自己。話說回來,其實javascript的理論在我看來並沒有那麼的枯燥難懂,但是需要你去實驗、去除錯。興趣永遠是學習最好的動力,我想保持這份興趣,持續的去研究javascript的理論,去探尋其中的祕密和讓人驚歎的地方。
關於this
閒話扯了那麼多,希望各位看官不要在意...只是本人一點點心聲罷了...言歸正傳,關於this,其實在我看來確實算是javascript中很基礎、很重要、也是很難理解的一個點;
this的定義,藉助下阮一峰大大的總結,感覺比較好理解些:
this是Javascript語言的一個關鍵字。 它代表函式執行時,自動生成的一個內部物件,只能在函式內部使用。比如,function test(){ this.x = 1; }隨著函式使用場合的不同,this的值會發生變化。但是有一個總的原則,那就是this指的是,呼叫函式的那個物件。
this的指向
其實this之所以難以理解,主要就是在不同情況下,this的指向都是不一樣的。以下幾種情況,基本歸納了常見的this的指向:
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
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基礎知識 熟悉常量和變量 能夠使用表達式和運算符 正確使用語句 能夠掌握數據類型和轉換的基本方法 正確使用函數、對象、
【五】makefile中if語句
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
【RegExp】JavaScript中正則表達式判斷匹配規則以及常用方法
返回 空字符串 tro true 正則表達式 str 本地 大小 表示範圍 字符串是編程時涉及到的最多的一種數據結構,對字符串進行操作的需求幾乎無處不在。 正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字