摘要:但是總有一個原則,那就是指的是調(diào)用函數(shù)的那個對象。還有另一個原則當沒有明確的調(diào)用函數(shù)的那個對象時,指向全局對象,瀏覽器模式下就是了。設(shè)置的值這兩個方法的作用都是在特定的作用域中調(diào)用函數(shù),從而設(shè)置了函數(shù)體內(nèi)的值。
感覺上篇文章還是三四天前寫的,看看日期已經(jīng)10天了。。時間過的真快!趕緊補篇,js中的this是我學(xué)習了但一直沒來得及總結(jié)的,今天就簡要說說 this 吧~
this簡述每個函數(shù)在被調(diào)用時都會自動取得兩個特殊的對象:this 和 arguments,arguments 是一個類數(shù)組對象,包含著傳入函數(shù)中的所有參數(shù), this 引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象。
this 對象是在運行時基于函數(shù)的執(zhí)行環(huán)境綁定的,它可能是全局對象或者其他的某個對象,隨著函數(shù)的執(zhí)行環(huán)境不同,this的值也會不一樣。但是總有一個原則,那就是
this 指的是 調(diào)用函數(shù)的 那個對象。
還有另一個原則:當沒有明確的調(diào)用函數(shù)的那個對象時,this指向全局對象global,瀏覽器模式下就是window了。
By default, this refers to the global object.
下面具體講講this 的指代原則。
this的指代原則 1. 函數(shù)直接被調(diào)用此時函數(shù)屬于全局性調(diào)用,其this代表全局對象global
var a = 5; function test() { console.log(this.a); } test(); // 5
注意下面這種情況:
function f1(){ console.log(this); function f2(){ console.log(this); } f2(); } f1(); // Window window
f2()輸出的也是window,可見無論是在全局中直接被調(diào)用,還是內(nèi)嵌在函數(shù)中被調(diào)用,只要是直接通過名字調(diào)用函數(shù)的,函數(shù)中的this在非嚴格模式下都是指向全局對象,而嚴格模式下就是undefined
2. 函數(shù)作為對象的方法調(diào)用此時this指向這個對象。
function test() { console.log(this.a); } var obj = {}; obj.a = 5; obj.m = test; obj.m(); // 53. 函數(shù)作為構(gòu)造函數(shù)調(diào)用
此時,this指向生成的新對象。
var a = 3; //全局變量a function Test() { this.a = 5; // 對象屬性a } var obj = new Test(); console.log(obj.a); // 5, 不是3!4. 匿名函數(shù)中的this
匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此,其this對象通常指向window。
var name = "The window"; var obj = { name: "My object", getName: function() { return function() { return this.name; }; } }; console.log(obj.getName()()); // "The window"設(shè)置this的值 1. call() / apply()
這兩個方法的作用都是在特定的作用域中調(diào)用函數(shù),從而設(shè)置了函數(shù)體內(nèi)this 的值。
apply() 方法接收兩個參數(shù):第一個參數(shù)是函數(shù)要運行的作用域,即對象。第二個參數(shù)是參數(shù)數(shù)組,既可以是Array的實例,也可以是arguments對象。call()和apply()的作用相同,二者唯一的差別就是接收參數(shù)的方式不同,即在使用call()方法時,傳遞給函數(shù)的參數(shù)必須逐個列舉出來。
通過例子看call()/apply()是如何改變this值的。
window.color = "red"; var o = {color: "blue"}; function sayColor() { console.log(this.color); } sayColor.call(o); // blue sayColor.call(window); // red sayColor.call(this); // red sayColor(); // red2. bind()
該方法創(chuàng)建一個函數(shù)的實例,其this的值會被綁定到傳給bind()函數(shù)的值。創(chuàng)建的新函數(shù)無論在哪里調(diào)用,this的值都是固定的。
window.color = "red"; var o = {color: "blue"}; function sayColor() { console.log(this.color); } var newSaycolor = sayColor.bind(o); newSayColor(); // blue,全局中調(diào)用,結(jié)果仍為blue
需要注意的是,支持bind()方法的瀏覽器有 IE9+ 、Firefox 4+ 、 Safari 5.1+ 、 Opera 12+ 和 Chrome。
eval()使用 eval() 方法時,this 指向哪里呢?
答案很簡單,看誰在調(diào)用 eval() 方法,eval()中的this就是調(diào)用者的執(zhí)行環(huán)境中的 this 。
這是我關(guān)于this的一點理解,歡迎大家拍磚~
參考文章:Javascript的this用法
深入淺出 JavaScript 中的 this
Javascript中this關(guān)鍵字詳解
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85810.html
摘要:方法在中定義的函數(shù)。這種聲明方式會定義一個生成器函數(shù),它返回一個對象。類用定義的類,實際上也是函數(shù)。調(diào)用函數(shù)時使用的引用,決定了函數(shù)執(zhí)行時刻的值。表示當為時,取全局對象,對應(yīng)了普通函數(shù)。四操作的內(nèi)置函數(shù)和可以指定函數(shù)調(diào)用時傳入的值。 筆記說明 重學(xué)前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習過程的一些要...
摘要:方法在中定義的函數(shù)。這種聲明方式會定義一個生成器函數(shù),它返回一個對象。類用定義的類,實際上也是函數(shù)。調(diào)用函數(shù)時使用的引用,決定了函數(shù)執(zhí)行時刻的值。表示當為時,取全局對象,對應(yīng)了普通函數(shù)。四操作的內(nèi)置函數(shù)和可以指定函數(shù)調(diào)用時傳入的值。 筆記說明 重學(xué)前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習過程的一些要...
摘要:方法在中定義的函數(shù)。這種聲明方式會定義一個生成器函數(shù),它返回一個對象。類用定義的類,實際上也是函數(shù)。調(diào)用函數(shù)時使用的引用,決定了函數(shù)執(zhí)行時刻的值。表示當為時,取全局對象,對應(yīng)了普通函數(shù)。四操作的內(nèi)置函數(shù)和可以指定函數(shù)調(diào)用時傳入的值。 筆記說明 重學(xué)前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習過程的一些要...
摘要:用構(gòu)造器模擬類的兩種方法在構(gòu)造器中修改,給添加屬性修改構(gòu)造器的屬性指向的對象,它是從這個構(gòu)造器構(gòu)造出來的所有對象的原型。 筆記說明 重學(xué)前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習過程的一些要點筆記以及感悟,完整的可以加入winter的專欄學(xué)習【原文有winter的語音】,如有侵權(quán)請聯(lián)系我,郵箱:kai...
閱讀 3218·2021-11-17 09:33
閱讀 3298·2021-11-15 11:37
閱讀 2965·2021-10-19 11:47
閱讀 3214·2019-08-29 15:32
閱讀 1018·2019-08-29 15:27
閱讀 1538·2019-08-29 13:15
閱讀 942·2019-08-29 12:47
閱讀 2035·2019-08-29 11:30