javascript
JavaScript this指向相关内容
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#操作NPOI插件的HSSFWorkB
- 下一篇: gradle idea java ssm