Web前端基礎知識:ES5及ES6this詳解
今天,我們學習一下JavaScript中的this。我們從什麼是this,ES5及ES6中this的幾種情況進行學習。讓this變的so easy,我們這裡說的都是非嚴格模式下。
什麼是this
this表示當前行為執行的主體,在javaScript中this不是函式獨有的,但是我們主要研究的是函式中的this,為了方便大家理解我們舉個例子。
小明今天專案成功上線了,提前下班,不用加班了,獎勵自己去肯德基吃一個漢堡,對於這句話我們簡單的分析下:
在哪裡吃:肯德基
誰吃:小明
在這裡肯德基是吃的環境,小明是當前吃這個行為的主體。
//全域性作用域下
Var myBody = document.body;
//window是可以省略的 當前body元素的寬度都會被輸出
console.log(window.getComputedStyle(myBody).width;);//726px
console.log(getComputedStyle(myBody).width;);//726px
//我們在這裡輸出this ->window
console.log(this);//window
ES5中this的幾種情況
1.全域性作用域下的this是window
前邊的我們說過this代表當前行為執行的主體,在全域性作用域下所有的屬性和方法都是window的屬性和方法,並且window是可以省略的。那麼也就是說我們去呼叫一個方法在全域性作用域下,誰呼叫的也就是window呼叫,那麼window就是當前行為執行的主體,和去肯德基吃漢堡是一樣的誰吃小明,那麼小明就是當前行為執行的主體。
2.自執行函式中的this是window
在javaScript中我們主要研究的是函式中的this,自執行函式中的this永遠是window,因為函式就是一個方法,一種行為,這個行為是直接執行的,那麼執行的主體就是window。
//這裡我們寫兩個自執行函式
~function(){
console.log(this); //->window
}();
(function (){
console.log(this);//->window
})();
3.當前函式執行就看前面有沒有點(.),點前面是誰this就是誰,和當前函式在哪裡定義的及在哪裡執行的沒有關係,沒有點就是window.
還是一樣的道理,.前面就表示當前行為執行的主體。如果沒有依然當前行為執行的主體是window.
//定義一個函式
function hello(){
console.log(this);
}
hello();//this->window
//定義一個物件設定屬性為hello值是對應的那個函式
Var obj = {hello:hello};
//我們再去呼叫的時候 發現是obj這個物件呼叫的這個函式 那麼obj就是當前行為執行的主體 和這個函式在哪裡定義是沒有關係的。
Obj.hello(); //this->obj
4.call,apply,bind改變this指向問題就看方法中的第一個引數是誰this就是誰。
首先call,apply,bind這三個方法都是用來改變this的指向,其實本質就是改變當前行為執行的主體。由於這個三個方法第一個引數傳遞都是當前行為執行的主體。所以就看第一個引數即可。
//定義一個函式
function world(){
console.log(this);
}
//定義一個物件
Var obj = {name:”哈哈”};
//將obj變為這個方法行為執行的主體
World.call(obj);//this->obj
//apply和bind同理只是傳遞引數和使用方式略有不同
ES6中this的幾種情況
1.箭頭函式是沒有自己this的,this是繼承它的宿主環境(上級作用域) 宿主環境不是執行的環境,而是定義的環境。
let fn = () => {
console.log(this);
}
fn();//this->window
let obj = {
name: "obj",
sum: function () {
fn(); //在widnow下定義的,所以它的宿主環境是widnow而不是sum
}
};
2. ES6類構造器中的this是當前這個例項,而原型上的函式中的this指向呼叫者。
//類中的this
class Btn {
constructor(tagName) {
this.btn = document.querySelector(id);
thisthis.btn.>
console.log(this); //this->這個類的例項
}
click() {
// 方法裡的this指向呼叫者
console.log(this); //this->btn這個元素
}
}
var btn = new Btn('input');
希望以上的分享能幫到大家!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2773978/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Web前端培訓基礎知識】ES5及ES6this詳解Web前端
- Web前端基礎知識整理Web前端
- Git基礎知識詳解Git
- Redis基礎知識詳解Redis
- 前端基礎知識前端
- 好程式設計師web前端教程分享web前端基礎知識程式設計師Web前端
- 前端-JavaScript基礎知識前端JavaScript
- IPv6基礎知識詳解
- 深入mysql基礎知識的詳解MySql
- 前端基礎之前端知識引入前端
- 【Web前端基礎知識】css表示顏色的方法Web前端CSS
- 零基礎該如何學習Web前端知識?Web前端
- 好程式設計師web前端教程分享web前端入門基礎知識程式設計師Web前端
- Web測試基礎-Html基礎知識WebHTML
- 【Web前端基礎知識】如何使用Canvas繪製圓形Web前端Canvas
- 【Web前端基礎知識】CSS的定位機制之定位Web前端CSS
- 前端基礎知識之html和css全解前端HTMLCSS
- 前端-html和css基礎知識前端HTMLCSS
- 好程式設計師web前端教程分享JS基礎知識程式設計師Web前端JS
- 前端基礎技術知識講解-面試圖譜前端面試
- 面試圖譜:前端基礎技術知識講解面試前端
- iOS 開發:『Runtime』詳解(一)基礎知識iOS
- [01-jwt]C# JWT基礎知識詳解JWTC#
- 好程式設計師web前端分享CSS基礎知識之position程式設計師Web前端CSS
- 前端知識點總結——JavaScript基礎前端JavaScript
- 「整理」前端微知識庫 —— 基礎技能前端
- 前端基礎知識複習之CSS前端CSS
- 前端基礎知識複習之html前端HTML
- 圖解 IP 基礎知識!圖解
- JS基礎知識梳理彙總 如何能學好Web前端開發JSWeb前端
- Web前端必備基礎知識點,百萬程式設計師:牛逼!Web前端程式設計師
- 惡補基礎知識:Java 棧與佇列詳解Java佇列
- JSP基礎知識及工程建立JS
- CTF | Web安全 Part1:基礎知識Web
- WEB網路滲透的基礎知識Web
- 《Web 自動化》基礎知識腦圖Web
- 前端-基礎知識體系(初級-上)前端
- 前端-基礎知識體系(初級-下)前端