日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript this指向相关内容

發(fā)布時(shí)間:2025/4/16 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript this指向相关内容 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1,默認(rèn)綁定this指向windw對象

?

看代碼:

function test(C){

var a = 123

function b(){};

}

在預(yù)編譯環(huán)節(jié)當(dāng)中。

OA{

arguments:[1],

this : window,

C : 1,

A : undefined,

b : funtion(){}

}

test(1)

PS: 也就是說,在正常情況下,函數(shù)執(zhí)行,this指向window;

那么有我們想改變this指向,我們該如何做到呢? 看下面

?

2,隱式改變:誰調(diào)用this指向誰;

?

看代碼:

var str = '2222';

var obj = {

str:'1111',

b:function(){

console.log(this.str)

}

}

第一步:

obj.b() 會出現(xiàn)什么? // 11111

實(shí)現(xiàn)誰調(diào)用指向誰

并且我們的dome的onclick事件都是

升級: var fun = obj.b;//fun 存放了 obj.b整個(gè)函數(shù)的引用

fun() //2222

為什么?誰調(diào)用只想誰!

再看一道題:

?

var str = '2222';

var obj = {

str:'1111',

b:function(){

console.log(this.str)

}

}

?

var obj2 = {

str:'33333',

b : function(fn){

fn()

}

}

?

obj2.b( obj.b)// 出現(xiàn)什么?2222

obj2.b = obj1.b

obj2.b();//3333

講解:

obj2.b( obj.b) 相當(dāng)于obj.b作為實(shí)參傳到函數(shù)里,形參接收之后,便有了obj.b的函數(shù)體引用,那么再

obj2.b里執(zhí)行的過程中,fn()并沒有對象調(diào)用它,只是一個(gè)單獨(dú)函數(shù)體執(zhí)行,內(nèi)部走預(yù)編譯的過程中。

從中擴(kuò)展出 setTimeout(function(){ },1000)或者回掉函數(shù)也是這個(gè)原理

?

?

3,顯式綁定:call apply bind

代碼如下

var str = 'window';

var obj = {

str :'str',

print:function(){

console.log(this.str);

}

}

?

let newPrint = obj.print.bind(window);//bind 返回一個(gè)新的this指向的函數(shù)

// newPrint();

newPrint.call(obj);//bind只能綁定一次 bind過的函數(shù) this無法在改變

// newnewPrint();

講解,我們想主動(dòng)改變this的指向,需要的方法call apply bind 。call和apply可以讓函數(shù)執(zhí)行,而bind可以返回一個(gè)新的函數(shù)體。bind改變this最厲害,bind之后的函數(shù),call和apply都無法改變;

但是有一個(gè)方法可以改變this ,那就是下面的new操作符,請看下面

?

4 ,new 操作符

function test(C){

// var this = object.create(test.prototyoe)

// {

// __proto__:test.prototype

//}

var a = 123

function b(){};

}

new test

講解:當(dāng)new的過程中,函數(shù)內(nèi)部出現(xiàn)// var this = object.create(test.prototyoe);使this發(fā)生改變。

?

總結(jié): 四種this綁定的權(quán)重(看誰最厲害)

//1,默認(rèn)綁定(空函數(shù)執(zhí)行,函數(shù)單純執(zhí)行,this指向window) 默認(rèn)權(quán)重

//2,隱式幫定(誰調(diào)用this指向誰) 第三權(quán)重

//3,顯式綁定 (call apply bind) 第二高權(quán)重

//4,new 綁定this 權(quán)重是最高的

?

?

升級知識:ES6箭頭函數(shù)中的this如何邦定?

?

//學(xué)習(xí)箭頭函數(shù),同學(xué)必須知道的幾件事。 重要!!!!

//1,箭頭函數(shù)沒有this 沒有arguments surper(class);

//2,箭頭函數(shù)不能new ,不當(dāng)成構(gòu)造函數(shù)來 沒有prototye;

//3,可以表示數(shù)據(jù)流向 方便JavaScript引擎優(yōu)化掃碼;

?

看代碼:

var reg = 'window';

var obj1 = {

reg:"reg",

print:() => console.log(this.reg)

}

?

var obj2 = {

reg:"reg",

print:function(){

console.log(this.reg)

}

}

obj1.print() //window

obj2.print() //reg

講解:箭頭函數(shù)具有綁定this的能力 ,一旦箭頭函數(shù)定義,this已經(jīng)綁定,并且無法修改;

箭頭綁定規(guī)則:綁定里最近的非箭頭函數(shù)作用域中的this : 1 找到最近的非箭頭的作用域 2 找this

?

最后再看一個(gè)例子:

?

var obj2 = {

reg:'obj',

getName:function(){

let show = () =>console.log(this.reg)

show();

}

}

obj2.getName() //obj

//scope2(show)----->scope1(getName) 'obj'

講解:箭頭函數(shù)show執(zhí)行,找上一個(gè)非箭頭函數(shù)作用域,發(fā)現(xiàn)是getName方法的作用域,然后找this,指向的是obj2,所以最后打印的是 ‘obj’;

轉(zhuǎn)載于:https://www.cnblogs.com/pandawind/p/9791029.html

總結(jié)

以上是生活随笔為你收集整理的JavaScript this指向相关内容的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。