欧美精品在线一区二区三区_亚洲女同精品视频_日韩一区免费_国产欧美久久久精品免费_国产这里只有精品_僵尸再翻生在线观看_久久99精品国产一区二区三区_亚洲免费一区二区_女教师淫辱の教室蜜臀av软件_中文字幕国产一区二区

this解析 記錄分享

2021-4-22    前端達人

this指向的問題也是JavaScript中的難點之一了,也是面試常問的問題,很多時候對this指向的問題就很懵逼,明明應該是指向他,為什么又指向他了…所以我就學習了一下這方面的知識,整理了一下,希望能夠幫助大家

為什么要用this?

首先看一段代碼

function identify(){
    return this.name.toUpperCase()
}
function speak(){
    var greeting = '你好,我是'+identify.call(this)
    console.log(greeting)
}

var me ={
    name:'kyle'
}

var you ={
    name:"reader"
}
identify.call(me) 
identify.call(you) 

speak.call(me) //?  你好,我是KYLE
speak.call(you) //? 你好,我是READER 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

上面的這段代碼中可以從不同的上下文對象 me 和 you 中重復的使用identify函數和speak函數
如果你不使用this的話 你就要顯式的將上下文對象作為參數傳遞進去,比如這樣:

function identify(context){
    return context.name.toUpperCase()
}
function speak(context){
    var greeting = '你好,我是'+identify(context)
    console.log(greeting)
}

var me ={
    name:'kyle'
}

var you ={
    name:"reader"
}
identify(me)
identify(you) 

speak(me) 
speak(you) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

就像這樣,這樣看起來就不想上面那樣簡潔了,你要把一個對象傳來傳去的

認識this

剛見到this的時候 覺得this指向是這個函數自身,或者是函數的作用域,后來發現其實不是這樣的的,不過也不能說錯了,因為有些情況確實是這樣的,比如這樣:

function foo(num){
    console.log('foo'+ num)
    this.count ++ 
}
foo.count = 0

var i;
for(i = 0;i<10;i++){
    if(i>5){
        foo.call(foo,i)
    }
}
console.log(foo.count) //4 這樣的話 this指向了foo本身  foo上面的count屬性++ 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

無法指向函數作用域

var a = 3
function foo() {
    var a = 2;
    bar.call(foo);
}
function bar() {
    console.log( this.a );
}
foo(); // undefined 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我們要記住非常重要的一點:this是在運行的時候進行綁定的,而不是在定義的時候綁定,this的綁定跟函數聲明的位置沒有關系,主要是取決于函數的調用方式,想要找到this指向誰,我們就要看懂函數是怎么調用的。

綁定規則

1.默認綁定

當一個獨立函數正常調用的時候,不帶任何修飾的調用

// 非嚴格模式下
var a = 3
function foo(){
    console.log(this.a) //a
}
foo() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

這種情況下 this.a被解析成了了 全局變量a,this指向是全局對象

// 嚴格模式下
var a = 3
function foo(){
    "use strict" 
    console.log(this.a) //TypeError
}
foo() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

嚴格模式下 this不會指向全局對象 this綁定的是undefined

2.隱式綁定

調用位置上是否有上下文對象

function foo(){
    console.log(this.a)
}
var obj = {
    a:2,
    foo:foo
}
obj.foo() //2 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

調用位置會使用obj上下文對象來引用函數,foo被調用的時候 他的落腳點指向是obj對象,隱式綁定的規則就會把this指向這個上下文對象。所以this.a就跟 obj.a是一樣的

function foo(){
    console.log(this.a)
}
var obj = {
    a:2,
    foo:foo
}
var obj2 = {
    a:3,
    obj:obj
}
obj2.obj.foo() //2 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

當多層調用的時候 只有最后一層才會影響函數的調用位置 比如上面這個 this綁定的還是 obj 而不是obj2

注意

隱式綁定會出現隱式丟失的問題,會失去綁定對象,最后應用默認綁定

var a = 3;
function foo(){
    console.log(this.a);
}
var obj = {
    a:2,
    foo:foo
}
var bar = obj.foo
bar() //3 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

bar 是 obj.foo的一個引用 他引用的是foo函數本身,此時bar就是一個不帶任何修飾的函數調用 應用默認綁定

var a = 3;
function foo(){
    console.log(this.a);
}
var obj = {
    a:2,
    foo:foo
}
setTimeout( obj.foo, 100 ) //3
setTimeout(function(fn){
    fn()
},100,obj.foo) //3 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

參數傳遞也是一種隱式賦值,回調函數丟失this是非常常見的…

3.顯式綁定

隱式綁定的時候我們必須在一個對象內部包含一個指向函數的屬性,然后通過屬性間接引用函數,把這個this間接隱式的綁定到這個對象上
如果我們不想在對象內部包含函數的引用 ,而想在某個對象上強制調用函數
我們可以把這個函數綁定到對象的原型上,也算是不用再對象內部包含函數了吧…
更好的辦法是我們可以使用函數的 call() apply() bind() 這種方法

function foo(){
    console.log(this.a)
}

var obj = {
    a:2
}
foo.call(obj) //2
foo.apply(obj) //2 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果你第一個參數傳入的是一個原始類型 比如字符串 布爾 數字作為綁定對象 這些原始類型會被轉換為 對象的形式 new String() new Number()…

硬綁定

Function.prototype.bind()
function foo(){
    console.log(this.a)
}

var obj = {
    a:2
}
var obj2 = {
    a:3
}
var bar = foo.bind(obj)  //會返回一個硬編碼的新函數 他會把參數設置為this的上下文
bar.call(obj2) //2  返回的新函數 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

有些api 方法 會提供一個可選參數 context 其作用跟bind一樣 確保你的回調函數使用指定的this 比如 array.forEach(fn,context)…

4.new綁定

使用new 來調用函數的時候會執行以下操作
1.創建一個全新的對象
2.這個新對象會被執行原型的鏈接
3.新對象會綁定到函數調用的this
4.如果沒有返回其他的對象,那么函數會自動返回這個對象

function Foo(a){
    this.a = a
}
var bar = new Foo(2)
console.log(bar.a) //2 
  • 1
  • 2
  • 3
  • 4
  • 5

使用new 來調用Foo函數 會構造一個新對象并把它綁定到Foo調用中的this上 然后返回了

優先級

函數不帶任何修飾的時候單獨調用才會觸發默認綁定 所以說默認綁定是優先級最低的了

那剩下三個規則哪個的優先級最高?

顯示綁定跟隱式綁定比較

function foo(){
    console.log(this.a)
}
var obj1 = {
    a:1,
    foo:foo
}

var obj2 = {
    a:2,
    foo:foo
}
obj1.foo() //1
obj2.foo() //2

obj1.foo.call(obj2) //2
obj2.foo.call(obj1) //1 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

可以看到 顯示綁定的優先級還是更高一點

new 綁定跟隱式綁定比較

function foo(arg){
    this.a = arg
}

var obj1 ={
    foo:foo
}
var obj2 ={}

obj1.foo(2)
console.log(obj1.a) //2

var bar = new obj1.foo(4)
console.log(obj1.a) //2
console.log(bar.a) //4 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

可以看到 new綁定的優先級比隱式綁定要高

new 綁定跟顯示綁定比較

new跟call apply無法一起使用 無法通過new foo.call(obj),試一下硬綁定

在這里插入代碼片 
  • 1
function foo(arg){
    this.a = arg
}
var obj1 ={}
var bar = foo.bind(obj1)
bar(3)
console.log(obj1.a) //3

var baz = new bar(4)
console.log(baz.a) //4
console.log(obj1.a) //3 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

new 調用bar修改了硬綁定時候的 函數的this new的優先級高一點

所以我們可以根據下面的優先級規則進行判斷了

1.函數是否在new中調用 是的話this綁定新創建的對象 var bar = new Foo()
2.函數是否通過call apply 顯示綁定或者是 bind硬綁定 如果是的話this指向指定的對象 foo.call(obj)
3.函數是否在某個上下文中調用 隱式綁定,如果是 this綁定那個上下文對象 注意綁定丟失的問題
4.如果都不是 就是默認綁定非嚴格模式下綁定的是全局對象 嚴格模式下綁定的是undefined

綁定例外

1.將null和undefined作為call apply參數 作為this綁定對象的時候 這些值會被忽略 應用的是默認綁定

var a =3
function foo(){
    console.log(this.a) //3
}
foo.call(null) 
  • 1
  • 2
  • 3
  • 4
  • 5

2.箭頭函數

function foo(){
    return ()=>{
        console.log(this.a)
    }
}
var obj1 = {
    a:3
}
var obj2 = {
    a:4
}
var bar = foo.call(obj1)
bar.call(obj2) //3  this綁定的是obj1 而不是obj2!!! 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在看一個

function foo(){
    setTimeout(()=>{
        console.log(this.a) //2
    },100)
}
var obj = {
    a:2
}
foo.call(obj) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

箭頭函數不使用this綁定的四種規則,而是根據外層作用域來決定this的,外層作用域的this綁定的是什么 他的this就是什么





轉自:csdn 論壇 作者:Selfimpr歐

藍藍設計www.ocunn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服

日歷

鏈接

個人資料

藍藍設計的小編 http://www.ocunn.cn

存檔

精品免费av| 久久亚洲精品成人| 欧美性猛交xxxx乱大交3| 久久久久久毛片免费看| 成人免费在线电影| 最近最新mv在线观看免费高清| 色综合久久久久久中文网| 国产xxx精品视频大全| 可以免费看不卡的av网站| 天天天综合网| 欧美国产一区二区三区激情无套| 天堂俺去俺来也www久久婷婷| 欧美国产中文高清| 成人黄页网站视频| 亚洲做受高潮无遮挡| 668精品在线视频| 欧美成人一品| 亚洲精品午夜久久久久久久| 免费看91的网站| 在线观看国产网站| 欧美xxxxx少妇| 美女搡bbb又爽又猛又黄www| 亚洲精品鲁一鲁一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品| 成人国产一区二区| 国产91一区二区三区| 91精品免费| 国产欧美日韩亚洲| 免费久久一级欧美特大黄| 久久精品中文字幕一区二区三区| 久久riav二区三区| 日韩亚洲一区在线播放| 欧美日韩电影免费看| 亚洲免费视频网| 国模无码一区二区三区| 懂色av成人一区二区三区| 欧洲av在线播放| 亚州av在线播放| 一区二区三区视频国产日韩| 日本韩国一区| 日本美女在线中文版| 日韩激情美女| a欧美人片人妖| 外国成人毛片| 台湾佬综合网| 欧美黄色aaaa| 日本美女视频一区二区| 国产一区视频导航| 91在线丨porny丨国产| 国产精品久久久久影院老司| 亚洲国产美国国产综合一区二区| 在线亚洲免费视频| 欧美电影精品一区二区| 中文字幕亚洲一区在线观看 | 欧美亚洲另类激情另类| 国产一区二区在线免费| 精品一区二区国产| 亚洲啊啊啊啊啊| 激情 小说 亚洲 图片: 伦| 亚洲综合在线一区二区| 天天躁日日躁aaaxxⅹ| 丰满少妇高潮久久三区| 成人小视频在线播放| 国产91免费看| 欧美成人三区| 久久婷婷五月综合色丁香| 欧洲亚洲视频| 亚洲国内精品| 国产白丝精品91爽爽久久| 国产精品久久久久久久久免费樱桃 | 神马午夜久久| 亚洲黄页一区| 国产99一区视频免费| 中文字幕在线视频一区| 欧美色精品在线视频| 亚洲乱码国产乱码精品精天堂| 欧美巨大黑人极品精男| 国产在线精品播放| 制服诱惑一区| 色偷偷中文字幕| 久久免费看少妇高潮v片特黄| 中文字幕人妻一区二区三区视频| 最近最新中文字幕在线| 精品丝袜在线| 沈樵精品国产成av片| 媚黑女一区二区| 久久精品欧美一区二区三区不卡 | 欧美性猛交一区二区三区精品| 亚洲码在线观看| 欧洲中文字幕国产精品| 茄子视频成人在线观看| 亚洲综合欧美在线| 午夜精品一区二区三级视频| 国产精品无码天天爽视频| 9i精品一二三区| 在线高清欧美| 国产精品jizz在线观看美国| 成人av在线一区二区| 岛国视频午夜一区免费在线观看| 日韩精品视频免费在线观看| 国产精品久久久999| 中文字幕成人一区| 911亚洲精选| 中文字幕在线播| 黄色大片在线看| 五十路在线视频| 日本黄视频在线观看| 2020日本在线视频中文字幕| 影视先锋久久| 高清av一区二区| 能直接看的av| 日本精品在线免费观看| 日韩在线观看视频一区| 久久男人av资源站| 99久久99热这里只有精品| 成人性生交大片免费看中文| 欧洲中文字幕精品| 久久男人的天堂| 制服.丝袜.亚洲.中文.综合| 91精品国产91久久久久| 一本—道久久a久久精品蜜桃| 欧美极品jizzhd欧美仙踪林| 国模 一区 二区 三区| 综合一区av| 国产日韩v精品一区二区| 6080亚洲精品一区二区| 国产成人高清激情视频在线观看| 色撸撸在线观看| av女人的天堂| 2222www色视频在线观看| 农村妇女一区二区| 青青青伊人色综合久久| 一本色道**综合亚洲精品蜜桃冫| 欧美黄色片免费观看| 亚洲欧美日韩综合一区| 精品一区二区三区蜜桃在线| 欧美vide| 日韩系列在线| 99国产精品国产精品久久| 日韩欧美一级精品久久| 91精品在线观看视频| 久久久综合视频| 亚洲欧美一级二级三级| 国产精品午夜免费| 在线观看日韩www视频免费| 欧美另类高清视频在线| 免费看黄色的视频| 视频在线不卡| 中文字幕中文字幕精品| wwww国产精品欧美| 亚洲区免费影片| 午夜精品一区二区在线观看的| 永久免费看mv网站入口78| 在线观看视频污| 偷拍亚洲色图| 欧美国产精品劲爆| 久久精品国产69国产精品亚洲| 亚洲精品中文综合第一页| 国产人与禽zoz0性伦| a√资源在线| 好吊视频一区二区三区四区| 午夜精品一区二区三区免费视频| 2019日本中文字幕| 热久久精品免费视频| 中文字幕制服诱惑| 怡红院av亚洲一区二区三区h| 国产综合免费视频| 国产精品午夜福利| 麻豆国产一区二区三区四区| 成人免费视频网站在线观看| 亚洲欧美第一页| 这里只有精品66| 在线观看免费国产视频| 天天免费亚洲黑人免费| 韩国视频一区二区| 亚洲精品视频久久| 免费cad大片在线观看| 日韩精品在线免费视频| 99久久综合国产精品二区| 国产激情偷乱视频一区二区三区 | 影音先锋日韩在线| 91国在线观看| 国产精品加勒比| 任我爽在线视频| gogo高清午夜人体在线| 九九九久久久精品| 亚洲欧洲日产国码av系列天堂| 永久免费在线看片视频| 自拍偷拍校园春色| 日韩欧美中文字幕在线视频| 国产精品网站一区| 国产成人综合一区二区三区| 四虎精品一区二区| 嫩草香蕉在线91一二三区| 国产精品婷婷| 日韩精品中文在线观看| 人妻av无码专区| 国产ts人妖调教重口男| 久久99精品久久久久久园产越南| 一区二区三区视频在线看| 国产欧美精品xxxx另类| 大胸美女被爆操| 欧美a级在线观看| 97久久人人超碰| 韩剧1988在线观看免费完整版| 久久久福利影院| 成年人在线视频| 日韩在线卡一卡二| 一区二区日韩精品| 91小视频网站| 超碰免费97在线观看| 日韩精品一级中文字幕精品视频免费观看| 亚洲电影中文字幕| 高清欧美精品xxxxx| 色噜噜在线播放| 黄色在线一区| 亚洲精品成人久久| 成人久久久久久久久| 四虎影视在线观看2413| 美女久久网站| 日韩性生活视频| 亚洲AV无码久久精品国产一区| 自拍视频在线网| 狠狠色丁香婷婷综合久久片| 久久999免费视频| 欧美xxxxx精品| 97超碰免费在线| 国产欧美精品日韩区二区麻豆天美| 国产精品com| 欧美人妻精品一区二区三区| 国产一区二区三区黄网站| 亚洲精品中文在线观看| 韩国成人av| 国产一区二区麻豆| 天天综合一区| 亚洲国产日韩欧美在线图片| 国产精品天天av精麻传媒| 国产日韩精品在线看| 国产在线看一区| 午夜视频在线观看一区二区 | 欧美高清一级片在线观看| 国产在线高清精品| 69视频免费在线观看| 国产精品一线天粉嫩av| 日韩欧美国产电影| 久久久免费高清电视剧观看| 国产一级伦理片| 欧美人体一区二区三区| 亚洲综合一区二区精品导航| 欧美日韩三区四区| 亚洲第一色网站| av影院在线| 成人亚洲综合天堂| 免费观看久久久4p| 2019亚洲日韩新视频| 午夜精品福利在线视频| 欧美激情15p| 日韩精品一区二| 国产永久免费网站| 日韩在线伦理| 亚洲国产精品欧美一二99| 欧美性精品220| 日韩一区二区精品视频| 国产艳妇疯狂做爰视频 | 欧美成人app| 狠狠操狠狠色综合网| 国产成人aaa| 日韩精品在线看片z| 手机av在线网| 在线日韩影院| 欧美日韩人人澡狠狠躁视频| 国产av熟女一区二区三区| h视频在线观看免费| 久久久久久夜精品精品免费| 九色91在线视频| 日本免费不卡视频| 国产精品夜夜嗨| 亚洲综合日韩在线| 99久久精品免费看国产交换| 日韩精品视频网| 国产精品欧美久久久| 国产精品成人久久久| 国产精品久久久久9999高清| 亚洲91av视频| 国产成人在线视频观看| 亚洲福利免费| 日韩av片免费在线观看| 国产精品suv一区| 99成人在线| 亚洲高清免费观看高清完整版在线观看| 国产精品1区二区.| 欧美人在线视频| 日本在线观看视频网站| 欧美激情综合色综合啪啪| 欧美精品999| av毛片在线免费观看| 先锋a资源在线看亚洲| 国产精品盗摄久久久| 国产又黄又粗又猛又爽| 久草在线在线精品观看| 国产精品v欧美精品∨日韩| 亚洲av片一区二区三区| 97国产精品videossex| 亚洲国产精品一区在线观看不卡| 蜜桃视频在线观看视频| 综合久久国产九一剧情麻豆| 日本黄色片一级片| 国产精品论坛| 欧美一区二区三区人| 天天插天天射天天干| 久久av综合| 久久久久久这里只有精品| 糖心vlog精品一区二区| 韩国成人在线视频| 久久99国产精品| 午夜视频在线观看免费视频| 亚洲成人综合网站| 91精品999| 偷拍一区二区| 精品少妇一区二区30p| 久久久久久亚洲av无码专区| 九色综合狠狠综合久久| 欧美理论一区二区| 在线看三级电影| 欧美日韩国产小视频在线观看| 91玉足脚交白嫩脚丫| 日韩片欧美片| 国产成一区二区| 亚州视频一区二区三区| 中文字幕在线播放不卡一区| 成人在线免费播放视频| 99国产精品免费网站| 日韩在线观看你懂的| 亚洲综合成人av| www.欧美.com| 黄色一级在线视频| 国产人与zoxxxx另类91| 久久亚洲国产成人| 国产丝袜视频在线观看| 国产欧美一区二区精品性色超碰| 免费在线观看亚洲视频| 久久久久亚洲精品中文字幕| 久久这里只有精品视频首页| 亚洲天堂中文字幕在线| 26uuu精品一区二区在线观看| 男人添女荫道口女人有什么感觉| 最新欧美电影| 在线国产精品播放| 中文字幕一区二区三区四区视频| 成人永久看片免费视频天堂| 无码日本精品xxxxxxxxx| 亚洲tv在线| 久久久久久91香蕉国产| 亚洲免费国产视频| 亚洲成人av电影在线| 亚洲国产果冻传媒av在线观看| 国产精品第十页| 久热国产精品视频一区二区三区| gogo高清在线播放免费| 亚洲老板91色精品久久| 亚洲自拍偷拍另类| 国产精品色在线| 好吊操视频这里只有精品| 一区二区三区午夜视频| 国产精品美女诱惑| 国产拍在线视频| 自拍偷拍亚洲欧美| 国产成人精品无码高潮| 一区二区三区欧美视频| 亚洲欧美视频在线播放| 蜜桃av综合| 欧美日韩午夜爽爽| 国产精品色在线网站| 国产精品黄色av| av网站免费在线观看| 亚洲精品v欧美精品v日韩精品| 无码人妻精品一区二区50| 国产精品无人区| 人妻无码中文久久久久专区| 午夜在线精品| 精精国产xxxx视频在线中文版 | www.久久成人| 五月天亚洲婷婷| 欧美性x x x| 成人综合在线视频| 亚洲一级免费在线观看| 欧美国产精品| 亚洲在线色站| 激情亚洲另类图片区小说区| 成人国内精品久久久久一区| 色综合一个色综合亚洲| 久久国产露脸精品国产| 久久久精品国产免费观看同学| 免费观看一区二区三区| 日韩激情视频在线观看| 久草青青在线观看| 欧美精品播放| 超级碰在线观看| 久久亚洲专区| 中文字幕在线亚洲精品|