主頁 > 移動端開發 > this指向-作用域、作用域鏈-預決議 變數提升-Vue組件傳值 父子 子父 非父子-Vue資料雙向系結原理

this指向-作用域、作用域鏈-預決議 變數提升-Vue組件傳值 父子 子父 非父子-Vue資料雙向系結原理

2020-11-14 14:19:44 移動端開發

目錄

  1. this指向
  2. 作用域、作用域鏈
  3. 預決議 變數提升
  4. Vue組件傳值 父子 子父 非父子
  5. Vue資料雙向系結原理

1.this指向

函式的this指向 看呼叫、不看宣告
(1)普通函式呼叫
①函式名() this->windown
(2)事件處理函式呼叫
①oDiv.onclick = function(){} this->添加事件的元素
  1.1 onclick  點擊事件
  1.2 onl oad  用戶進入某個頁面的時候觸發(onload 事件可用于檢測訪問者的瀏覽器型別和瀏覽器版本,并基于這些資訊來加載網頁的正確版本,)
  1.3 onunload  用戶離開某個頁面的時候觸發(onload 和 onunload 事件可用于處理 cookie,)
  1.4 onchange  內容變化事件(常結合對輸入欄位的驗證來使用)
  1.5 onm ouseover  滑鼠移動到HTML元素上方的事件
  1.6 onm ouseout  滑鼠移出HTML元素上方的事件
  1.7 onm ousedown  滑鼠按下的時候觸發的事件
  1.8 onm ouseup  滑鼠彈起觸發的事件(onmousedown,onmouseup和onclick區別,onclick是滑鼠完成點擊事件的時候觸發的事件)
  1.9 onfocus  元素獲取焦點事件
  1.10 onblur  元素失去焦點事件
  1.11 onabort  影像的加載失敗
  1.12 ondblclick  雙擊事件
  1.13 one rror  當加載影像和檔案時發生錯誤
  1.14 onkeydown  鍵盤按鍵被按下發生的事件
  1.15 onkeyup  鍵盤按鍵被松開發生的事件
  1.16 onkeypress  鍵盤按鍵按下并松開發生的事件
  1.17 onm ousemove  滑鼠移動
  1.18 onresize  視窗或者框架被重新調整大小
  1.19 onselect  文本被選中
  1.20 onreset  重置按鈕被點擊
  1.21 onsubmit  提交按鈕被點擊

(3)全域中this指向window物件

(4)物件的方法函式

Var obj = {fn:function(){}}
物件名.方法名()   obj.fn(); this->呼叫方法的物件(物件名)obj

例1.普通函式this默認指向window

 function fun(){
            console.log(this)  //window
        }        
  fun()  //相當于window.fun()

例2.物件的方法 物件.方法呼叫this指向該物件

let obj={
         name:'胡歌',
         age:"18",
         speak(){
             console.log(this.name+'今年'+this.age,this)  
             //胡歌今年18   this指向這個物件
            }
        }
obj.speak()  //誰呼叫這個方法指向誰

例3.函式誰呼叫指向誰

function constructorFun(name='虹貓藍兔七俠傳',age='16'){
        this.name=name;
        this.age=age;
        this.speak=function(){
             console.log(this.name+'的年齡是'+this.age,this)
            }
        }
        let childObj = new constructorFun('胡歌',20)
        childObj.speak()  
        //胡歌的年齡是20  this指向childObj這個物件 
        //this指向實體
        //比如:vue實體  就是new出來的 在使用中通常會使用this點方法名來使用方法,這些方法都是vue這個類上面的方法,

例4.事件物件 誰觸發事件指向誰

 <div id="box">我是id=box盒子</div>
 let boxid = document.getElementById('box')
 boxid.onclick=function(){
        console.log(this)  //指向box這個dom物件
         this.innerHTML='我是用this改變后的innerHTML'
    }

例5.箭頭函式this指向外層作用域的this

<div class="box">我是class=box盒子</div>
 let boxclass = document.getElementsByClassName('box')[0]
        boxclass.onclick=()=>{
            console.log(this)  //當前作用域外層this指向window
            this.alert('我是window物件')
        }

總的來說
①方法函式:物件.方法() ; this->呼叫方法的物件
②普通函式:( window.) 函式名() this->window
③事件處理函式: oDiv.οnclick= function(){} oDiv.onclick() this->添加事件的元素
④全域中的this指向window物件

2.作用域、作用域鏈

它是指對某一變數和函式具有訪問權限的代碼空間
在js中只有兩種作用域
1.全域作用域:script標簽內部的區域就是全域作用域
2.區域作用域:函式大括號內部的區域就是區域作用域
在js中只有函式可以劃分作用域,因此每個函式的大括號內部都是一個區域作用域

window.onload = function () { //在這里再寫上你的函式 }

因此我們稱區域作用域為函式作用域
1.全域變數 宣告在全域的變數
2.全域作用域就是全域變數起作用的范圍
3.區域變數 在函式內部宣告的變數
4.區域作用域就是區域變數起作用的范圍

  <script>
    	  //script標簽中的空間就是全域作用域
         //全域作用域
         //a變數就宣告在了全域作用域,就是一個全域變數
        var a;  //全域變數
        a(a)
        a = 10;
        function a(a) {
            //函式大括號內區域作用域
            //在函式內部宣告的變數就是區域變數
            let b = 10;//區域變數
            console.log(a)
            a = 100
        }
        console.log(a)
        console.log(b) //b is not defined
        var c;
        console.log(c)//undefined
    </script>

作用域鏈
會先在當前作用域查找變數,當前沒有向上一級查詢

1.當前有使用當前的變數
在這里插入圖片描述

首先,函式不呼叫不執行,所以呼叫了fun函式,在fun函式中,有一個函式a,呼叫了函式a,列印了a,呼叫a會執行a函式,里面var了一個a賦值為10,所以在函式a中列印a出的結果為10,在fun函式中列印a的結果是函式a這個函式體,

2.當前沒有向上一級查找變數,一直到全域作用域為止,如果還是沒有會報錯,xxx is not defined,

 var c = 100;//全域作用域中有c
        function num(b) {
        //上一級函式區域作用域也沒有c
            var a = 10;
            function sum() {
                console.log(a + b + c) //當前函式區域作用域沒有c
            }
            sum()
        }
        // num(10)  //10+10+100
        num(10)  //120

3.瀏覽器預決議變數提升

提升的物件包括:
1.函式宣告
2.變數宣告
3.函式內部作用域默認形參宣告

1.函式宣告和變數宣告是同一個變數名
當函式宣告和變數宣告沖突的時候,變數宣告無法覆寫函式宣告,變數賦值可以覆寫函式宣告 所以最后結果為10
具體代碼:

 a(a)  //呼叫函式
    a = 10;  //變數   
    var a;  //全域變數
    //或者 var a = 10;  同上面兩句
    function a(a) {  //函式

    }
    console.log(a)//10

瀏覽器對js代碼的預決議,這是代碼執行之前的操作,也叫變數提升,
函式和定義變數會被提升到當前作用域最頂端,當函式名和定義變數名字一樣時,函式名會覆寫變數定義,
預決議完成后的代碼:

  //上面預決議完成后是
    function a(a) { 

    }
    a(a)  //呼叫函式 
    a = 10;  //給變數a重新賦值覆寫函式體
    console.log(a)//10

2.函式形參和變數宣告是同一個變數名

  a(a)  //呼叫函式
    a = 10;  //變數
    b=20;//變數
    var a;  //全域變數
    function a(a) {  //函式
        var a = 100;
        b=200
        console.log(a,b)  //100  200
    }
    var b;
    console.log(a)//10

當函式呼叫的時候,就要進入函式的區域作用域 瀏覽器還要重新再區域作用域中進行預決議,變數名定義提前 賦值不會提前,
1.引數的傳遞和函式中變數名沖突,函式形參的值會覆寫預決議的效果
2.在函式執行之前進行預決議,這時候引數還沒傳遞
3.預決議以后 函式內代碼開始執行 傳參
4.在函式中如果沒有定義這個變數 就要在全域作用域中查找
5.賦值的時候函式中沒有這個變數根據作用域鏈也會將全域這個變數的值發生改變
函式體內正常預決議代碼,沒有形參參與:

var b;
    function a(a) {  //函式
        var a;
        a = 100;
        b = 200
        console.log(a, b)
    }
    a(a)  //呼叫函式
    a = 10;  //變數
    b = 20;//變數
    console.log(a)//10

函式開始執行,形參接受到實參的時候:

var b;
        function a(a) {  //函式
            var a =a; //定義a為形參a  引數
            a = 100;  //被重新賦值
            b = 200
            console.log(a, b)  //100  200
        }
        a(a)  //呼叫函式
        a = 10;  //變數
        b = 20;//變數
        console.log(a)//10
        console,log(b)//20

在執行函式的時候,函式內部有用到b,并且被重新賦值,b由undefined變成200,改變全域變數的值,在后面的同步代碼中b又被重新賦值,所以最終列印b的值為20,

陣列的參考地址
下面的代碼在瀏覽器運行

	var arr = [3, 4]; 
console.log(arr); 
arr.push(5);
 	console.log(arr);

運行結果為:
在這里插入圖片描述

點開看到第二行列印,里面還有5
在這里插入圖片描述

實際第二行代碼列印的就是[3,4],但是由于陣列是參考資料型別(復雜資料型別),記憶體地址是一樣的,顯示的是原來的結果,但包含修改后的結果.(淺拷貝,拷貝堆疊里面的指標)

第一次列印的時候,記憶體地址還沒有變,第二次列印的時候已經發生了變化,點開第一次列印,所指向的記憶體地址已經發生了變化,進而陣列項資料也發生了變化,
ie: 11 跟不上進度
在這里插入圖片描述

		var arr = [3, 4]; 
        let brr=arr;
        brr.push(5)
        console.log(arr); 3 4 5 

4.Vue組件傳值 父子 子父 非父子

1.父子

 //父   引入子組件  注冊 使用 系結屬性 系結方法
        <v-child :abc="a" @zjq="num"></v-child>
//子     props接受  在views使用  {{}}
        props: ["abc"],
        我是父組件傳過來的 {{abc}}

2.子父

 // 父
          <v-child :abc="a" @zjq="num"></v-child>
//子
          <button @click="CHILDRENfun">我是子組件的按鈕</button>
         CHILDRENfun(){
           this.$emit('zjq','我是子組件來的資料')
       }
//父
     num(item) {
       console.log("我是父組件的方法,num", item);
     }

3.1非父子


```javascript
 // main.js檔案
 import Vue from 'vue'
        import App from './App'
        import router from './router'
        Vue.config.productionTip = false
        Vue.prototype.$eventsBus = new Vue()
        new Vue({
            el: '#app',
            router,
            components: { App },
            template: '<App/>'
        })
//1  觸發方法
/ <button @click="getBroFun">children按鈕</button>
 getBroFun(){
     this.$eventsBus.$emit('zzz',123)
},
//2監聽方法
  this.$eventsBus.$on('zzz',(num)=>{
         console.log(num)
       })

3.2 下載events模塊
Events.js

const EventEmitter = require('events')
const ee =new EventEmitter()
export default {ee}

Main.js

import events from './assets/js/events'
Vue.prototype.$events = events.ee
 //1  觸發方法
getBroFun() {
      this.$events.emit("asd", 123);
},
//2監聽方法
 this.$events.on("asd", num => {
      console.log(num);
      this.num = num;
    });

5.Vue資料雙向系結原理

點擊鏈接直通車 == > 大佬詳細介紹Vue原理
new Vue() ==> Observer資料劫持 ==> 系結Dep ==> 通知watcher ==> 更新視圖
new Vue() ==> Compile決議模板指令 ==> 初始化視圖 和 系結watcher
在這里插入圖片描述

Observer :資料監聽器,能夠對資料物件的所有屬性進行監聽,如有變動可拿到最新值并通知訂閱者,內部采用Object.defineProperty 的 getter 和 setter 來實作
Dep :訂閱者收集器或者叫訊息訂閱器都可以,它在內部維護了一個陣列,用來收集訂閱者,當資料改變觸發 notify 函式,再呼叫訂閱者的 update 方法
Watcher :訂閱者,它是連接 Observer 和 Compile 的橋梁,收到訊息訂閱器的通知,更新視圖
Compile :指令決議器,它的作用對每個元素節點的指令進行掃描和決議,根據指令模板替換資料,以及系結相應的更新函式
Updater:視圖更新

阿里面試題

   function Foo() {
        getName = function () {
            console.log(1);
        };
        return this;
    }
    Foo.getName = function () {
        console.log(2);
    };
    Foo.prototype.getName = function () {
        console.log(3);
    };
    var getName = function () {
        console.log(4);
    };
    function getName() {
        console.log(5);
    }
    Foo.getName();
    getName();
    Foo().getName();
    getName();
    new Foo.getName();
    new Foo().getName();
    new new Foo().getName();

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/215024.html

標籤:其他

上一篇:RTSP協議TSINGSEE青犀視頻平臺EasyNVR如何通過GET傳值的方式獲取通過登錄鑒權

下一篇:axios 默認配置和實體配置

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more