摘要:基本操作理解寫在前面在面向?qū)ο蟮恼Z言中,關(guān)鍵字的含義是明確且具體的,即指代當(dāng)前對象。一般在編譯期確定下來,或稱為編譯期綁定。全局范圍內(nèi)當(dāng)在全部范圍內(nèi)使用,它將會指向全局對象。輸出瀏覽器中運(yùn)行的腳本,這個全局對象是。
js基本操作-this理解 寫在前面
在面向?qū)ο蟮恼Z言中,this關(guān)鍵字的含義是明確且具體的,即指代當(dāng)前對象。一般在編譯期確定下來,或稱為編譯期綁定。而在 JavaScript中,this是動態(tài)綁定,或稱為運(yùn)行期綁定的,這就導(dǎo)致JavaScript中的this關(guān)鍵字有能力具備多重含義,帶來靈活性的同時,也為初學(xué)者帶來不少困惑。
當(dāng)然,還是老話,所有的方法都來自網(wǎng)上,學(xué)到了才是自己的??!
然后,寫在前面,帶上我們可愛的小伙伴。廢話不多說,下面我們開始看起吧!
文章主要是對js的this進(jìn)行簡單的說明和介紹,順帶會添加一些代碼,沒辦法,語言能力有限,說明不了的只能直接上代碼了。
關(guān)于JS中的this,這是很多前端面試必考的題目,有時候在網(wǎng)上看到這些題目,看著感覺還不錯,做起來非常的酸爽!而在實(shí)際的開發(fā)中,也會遇到各種使用this的問題。當(dāng)然,在剛開始的時候,我們可能會非常的困惑,這個地方,為什么要這樣使用this尼?有時候不明白為什么不直接使用this,而要把this作為參數(shù)傳入。
下面,我將以我的理解的方式對this的理解和使用,做一個簡單的介紹。
this的理解接單的理解:this指的是引用它的對象。
當(dāng)然,也可以套用輪子哥的一個解釋:
this在js的函數(shù)里面只是一個參數(shù),是通過Fuck.Shit(Bitches)這種語法來傳遞的,點(diǎn)號前面的表達(dá)式就算this。不要想太多。
一般來說,闡述JavaScript中this的運(yùn)作機(jī)制,下面一句話詮釋的非常貼切。
When a function of an object was called, the object will be passed into the execution context as this value
簡而言之,就是function的this永遠(yuǎn)指向調(diào)用它的對象。而鑒于JS所謂的“萬物皆對象”,這個this因此可以是任何物件,比如Global對象
JavaScript有一套完全不同于其它語言的對this的處理機(jī)制。 下面,將會在不同的情況下,this指向的各不相同。
1.全局范圍內(nèi)當(dāng)在全部范圍內(nèi)使用 this,它將會指向全局對象。
this; console.log(this);//輸出window
2.函數(shù)調(diào)用瀏覽器中運(yùn)行的 JavaScript 腳本,這個全局對象是 window。
這里this也會指向全局對象。
function foo(){ console.log(this); } foo();//輸出window3.方法調(diào)用
這個例子中,this 指向調(diào)用方法的對象。
var test = { foo : function(){ console.log(this); } } test.foo();//輸出test對象4.調(diào)用構(gòu)造函數(shù)
如果函數(shù)傾向于和 new 關(guān)鍵詞一塊使用,則我們稱這個函數(shù)是 構(gòu)造函數(shù)。 在函數(shù)內(nèi)部,this 指向新創(chuàng)建的對象。
function foo(name,age){ this.name = name; this.age = age; console.log(this); } new foo("yu",23);//輸出新創(chuàng)建的對象 foo {name: "yu", age: 23}5.顯式的設(shè)置
當(dāng)使用Function.prototype上的call或者apply方法時,函數(shù)內(nèi)的this將會被顯式設(shè)置為函數(shù)調(diào)用的第一個參數(shù)。
因此函數(shù)調(diào)用的規(guī)則在上例中已經(jīng)不適用了,在foo 函數(shù)內(nèi) this 被設(shè)置成了 bar。
function foo(a, b, c) { this.a = a; this.b = b; this.c = c; } var bar = {}; foo.apply(bar, [1, 2, 3]); // 數(shù)組將會被擴(kuò)展,bar被修改為Object {a: 1, b: 2, c: 3} foo.call(bar, 4, 4, 4); // 傳遞到foo的參數(shù)是:a = 4, b = 4, c = 4; bar被修改為Object {a: 4, b: 4, c: 4}
這里使用了apply和call方法,用于修改this指針的指向。會在后面的文章中詳細(xì)說明。
使用用例題目描述:
實(shí)現(xiàn)函數(shù) callIt,調(diào)用之后滿足如下條件
1、返回的結(jié)果為調(diào)用 fn 之后的結(jié)果
2、fn 的調(diào)用參數(shù)為 callIt 的第一個參數(shù)之后的全部參數(shù)
輸入例子:
var a = 1; var b = 2; var test = function (first, second) { return first === a && second === b; }; callIt(test, a, b);
輸出例子: true
代碼實(shí)現(xiàn)
//方法一 function callIt(fn) { var arr = [].slice.call(arguments,1); return fn.call(null, arr[0], arr[1]);//因?yàn)橹挥袃蓚€參數(shù),這里直接使用兩個了 // } //方法二 function callIt(fn) { //Array.prototype.slice.call的作用是將arguments偽對象轉(zhuǎn)換成數(shù)組對象。 //下面的目的是,將arguments轉(zhuǎn)化為數(shù)組后,截取第一個元素之后的所有元素 return fn.apply(this,[].slice.call(arguments,1));//這里用[]代替Array.prototype,也可以使用下面的。 //return fn.apply(this,Array.prototype.slice.call(arguments,1)); }
其他說明代碼說明:
首先,arguments不是真正的數(shù)組,不能直接使用slice方法,所以才會用Array對象原型鏈上面的slice方法去處理arguments,返回的自然是一個數(shù)組。
另外,給apply/call傳遞null,“”空字符串,默認(rèn)都是this
參考文檔以上的所有方法,都來自網(wǎng)上。
所有的方法,都必須腳踏實(shí)地,在具體應(yīng)用場景下去分析、去選擇,我們應(yīng)該按照具體的情況,來選擇方法。
因?yàn)闉g覽器的多樣性,前端的應(yīng)用場景經(jīng)常很復(fù)雜,性能優(yōu)化充滿挑戰(zhàn),也充滿機(jī)遇。
學(xué)會了才是自己的,知道會用會寫,才是我們最終的目標(biāo)。
javascript秘密花園
如何理解 JavaScript 中的 this 關(guān)鍵字?
Javascript的this用法
(編程題)使用 apply 調(diào)用函數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/91354.html
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠矶际侵械闹鲗?dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠矶际荍avaScript中的主導(dǎo)范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數(shù)式編程越來越多得受到開發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:面向?qū)ο罄斫鈱ο蠛蛯ο蟮拿枋鎏匦悦嫦驅(qū)ο竺嫦驅(qū)ο蟮恼Z言都有一個特性都有類的概念。默認(rèn)值是使用對象字面量的方式為對象添加的屬性,其的值是,的值是指定的值。同數(shù)據(jù)屬性同數(shù)據(jù)屬性讀取的時候調(diào)用函數(shù)。 JavaScript面向?qū)ο驩OM 1(理解對象和對象的描述特性) Date: Updated At Oct 31, 2018 | JavaScript | 面向?qū)ο?| Author: Zhe...
摘要:面向?qū)ο罄斫鈱ο蠛蛯ο蟮拿枋鎏匦悦嫦驅(qū)ο竺嫦驅(qū)ο蟮恼Z言都有一個特性都有類的概念。默認(rèn)值是使用對象字面量的方式為對象添加的屬性,其的值是,的值是指定的值。同數(shù)據(jù)屬性同數(shù)據(jù)屬性讀取的時候調(diào)用函數(shù)。 JavaScript面向?qū)ο驩OM 1(理解對象和對象的描述特性) Date: Updated At Oct 31, 2018 | JavaScript | 面向?qū)ο?| Author: Zhe...
閱讀 3048·2021-10-13 09:39
閱讀 1889·2021-09-02 15:15
閱讀 2451·2019-08-30 15:54
閱讀 1814·2019-08-30 14:01
閱讀 2613·2019-08-29 14:13
閱讀 1426·2019-08-29 13:10
閱讀 2740·2019-08-28 18:15
閱讀 3899·2019-08-26 10:20