JavaScript深入刨析this的指向以及如何修改指向
this
老規(guī)矩先看代碼:
方法中
function test(){ console.log(this); }
對(duì)象中
Person={ name:"張三", eat:function(){ console.log(this) } }
在方法中,this表示該方法所屬的對(duì)象。因?yàn)榈谝粋€(gè)是window上的方法,所以打印了window,而eat方法是Person方法,所以打印除了對(duì)象Person。
所以可以看出單獨(dú)在控制臺(tái)使用this, 表示全局對(duì)象。
隱藏的this
在對(duì)象,可以提前聲明一個(gè)一個(gè):
var Person1={ name:"張三", age:18 } var Person2={ name:"李四", age:19 }
這樣寫會(huì)很麻煩,所以可以借鑒一下java類的概念,可以這樣:
var Person=function(name,age){ this.name=name, this.age=age } var Person1=new Person("張三",18); var Person2=new Person("李四",19);
其實(shí)在new的時(shí)候隱藏了一個(gè)return this,如果不使用new的話,發(fā)現(xiàn)其沒有返回這個(gè)新建的對(duì)象。
那么現(xiàn)在補(bǔ)全一下看:
var Person=function(name,age){ this.name=name, this.age=age return this; } var Person1=new Person("張三",18); var Person2=new Person("李四",19);
這樣的話,甚至可以偽造一個(gè)this的效果:
var Person=function(name,age){ var that={}; that.name=name, that.age=age return that; } var Person1=new Person("張三",18); var Person2=new Person("李四",19);
嚴(yán)格模式
this在嚴(yán)格模式和非嚴(yán)格模式下有些神奇的情況
function test() { return this; } # 如果js前面添加"use strict" 代表是嚴(yán)格模式 "use strict"; function test() { return this; }
這個(gè)可以看出在非嚴(yán)格模式下函數(shù)中,函數(shù)的所屬者默認(rèn)綁定到 this 上。所以可以打印出全局,但是嚴(yán)格模式下函數(shù)是沒有綁定到 this 上,這時(shí)候 this 是 undefined。
可以改變this指向
先看代碼
var Person=function(name,age){ this.name=name, this.age=age, this.fun=function(){ console.log("打印",this.name); } } var Person1=new Person("張三",18); var Person2=new Person("李四",19);
可以看出this指向的window中的a的值而不是方法test中的值,但是有些關(guān)鍵字是可以修改指向的。
可以看出方法前的對(duì)象是誰,調(diào)用的this就是誰,但是可以修改的比如使用關(guān)鍵字 call ,apply ,bind
看上面的話,可以看出call和apply兩個(gè)很像,而bind不會(huì)立即執(zhí)行函數(shù),需要帶()執(zhí)行。
不過如果帶上參數(shù)的話,會(huì)發(fā)現(xiàn)call和apply還是不同的,但是其里面都必須是對(duì)象才行,畢竟this這個(gè)指向就是對(duì)象
關(guān)鍵字 | 直接調(diào)用方法 | 參數(shù) |
---|---|---|
call | 會(huì)自動(dòng)運(yùn)行使用的方法 | 都可以帶參數(shù)格式如下:obj1.obj1Fun.call( obj2, 參數(shù)1, 參數(shù)1 ………………); |
apply | 會(huì)自動(dòng)運(yùn)行使用的方法 | 都可以帶參數(shù)格式如下:obj1.obj1Fun.apply( [ obj2, 參數(shù)1, 參數(shù)1 ………………]); 對(duì)比call的參數(shù)其參數(shù)用 [ ] 包住 |
bind | 不會(huì)自動(dòng)運(yùn)行使用的方法,需要后面+(),進(jìn)行調(diào)用 | 都可以帶參數(shù)格式如下:都可以帶參數(shù)格式如下:obj1.obj1Fun.bind( [ obj2, 參數(shù)1, 參數(shù)1 ………………])(); 對(duì)比apply的參數(shù)是一樣的,只不過其需要后面+()才能調(diào)用 |
到此這篇關(guān)于JavaScript深入刨析this的指向以及如何修改指向的文章就介紹到這了,更多相關(guān)JavaScript this指向內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
electron-builder 的基本使用及electron打包步驟
electron-builder 作為一個(gè)用于 Electron 應(yīng)用程序打包的工具,需要下載并使用 Electron 運(yùn)行時(shí)來創(chuàng)建可執(zhí)行文件,這篇文章主要介紹了electron-builder 的基本使用,需要的朋友可以參考下2023-12-12js實(shí)現(xiàn)同一頁(yè)面可多次調(diào)用的圖片幻燈切換效果
這篇文章主要介紹了js實(shí)現(xiàn)同一頁(yè)面可多次調(diào)用的圖片幻燈切換效果,可實(shí)現(xiàn)在同一頁(yè)面中多次調(diào)用幻燈切換效果,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02下一代Bootstrap的5個(gè)特點(diǎn) 超酷炫!
下一代Bootstrap的5個(gè)特點(diǎn),超酷炫,你還猶豫什么,趕緊來學(xué)習(xí)吧2016-06-06javascript-hashchange事件和歷史狀態(tài)管理實(shí)例分析
這篇文章主要介紹了javascript-hashchange事件和歷史狀態(tài)管理,結(jié)合實(shí)例形式分析了javascript-hashchange基本功能、原理及歷史狀態(tài)管理相關(guān)操作技巧,需要的朋友可以參考下2020-04-04淺談js繼承的實(shí)現(xiàn)及公有、私有、靜態(tài)方法的書寫
下面小編就為大家?guī)硪黄獪\談js繼承的實(shí)現(xiàn)及公有、私有、靜態(tài)方法的書寫。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10動(dòng)態(tài)加載js、css等文件跨iframe實(shí)現(xiàn)
這篇文章主要介紹了動(dòng)態(tài)加載js、css等文件跨iframe實(shí)現(xiàn)的方法,需要的朋友可以參考下2014-02-02在JavaScript中實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用的實(shí)現(xiàn)
這篇文章主要介紹了在JavaScript中實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12