js函數、js對象的這些點你真的懂嗎?

本篇學習目標

?了解函數(高級)原型原型鏈概念\textcolor{green}{了解函數(高級)原型原型鏈概念}

?掌握函數作用域\textcolor{green}{掌握函數作用域}

?掌握閉包的使用與缺點\textcolor{green}{掌握閉包的使用與缺點}使

?了解js對象高級嘗試\textcolor{green}{了解js對象高級嘗試}js

?掌握對象的幾種創建形式\textcolor{green}{掌握對象的幾種創建形式}

?掌握對象的繼承模式\textcolor{green}{掌握對象的繼承模式}

文章目錄

  • 1.函數(高級)
    • 1. 1 原型與原型鏈
      • 1). 所有函數都有一個特別的屬性:
      • 2). 所有實例對象都有一個特別的屬性:
      • 3). 顯式原型與隱式原型的關系
      • 4). 原型鏈
      • 5). 詳圖
    • 1. 2 執行上下文與執行上下文棧
      • 1). 變量提升與函數提升
      • 2). 理解
      • 3). 分類:
      • 4). 生命周期
      • 5). 包含哪些屬性:
      • 6). 執行上下文創建和初始化的過程
    • 1. 3 作用域與作用域鏈
      • 1). 理解:
      • 2). 分類:
      • 3). 作用
      • 4). 區別作用域與執行上下文
    • 1. 4 閉包
      • 1). 理解:
      • 2). 作用:
      • 3). 寫一個閉包程序
      • 4). 閉包應用:
      • 5). 缺點:
    • 1. 5 內存溢出與內存泄露
      • 1). 內存溢出
      • 2). 內存泄露
  • 2.對象(高級)
    • 2.1 對象的創建模式
      • 1). Object構造函數模式
      • 2). 對象字面量模式
      • 3). 構造函數模式
      • 4). 構造函數+原型的組合模式
    • 2. 2 繼承模式
      • 1). 原型鏈繼承 : 得到方法
      • 2). 借用構造函數 : 得到屬性
      • 3). 組合
    • 2.3 理解
      • 1). 定義一個函數背后做了什么?
      • 2). new一個對象背后做了些什么?
  • 本期推薦
  • 寫在最后

1.函數(高級)

1. 1 原型與原型鏈

在這里插入圖片描述

1). 所有函數都有一個特別的屬性:

prototype : 顯式原型屬性

2). 所有實例對象都有一個特別的屬性:

__proto__ : 隱式原型屬性

3). 顯式原型與隱式原型的關系

函數的prototype: 定義函數時被自動賦值, 值默認為{}, 即用為原型對象
實例對象的__proto__: 在創建實例對象時被自動添加, 并賦值為構造函數的prototype值
原型對象即為當前實例對象的父對象

4). 原型鏈

在這里插入圖片描述

所有的實例對象都有__proto__屬性, 它指向的就是原型對象
這樣通過__proto__屬性就形成了一個鏈的結構---->原型鏈
當查找對象內部的屬性/方法時, js引擎自動沿著這個原型鏈查找
當給對象屬性賦值時不會使用原型鏈, 而只是在當前對象中進行操作

5). 詳圖

function Foo () {}var f1 = new Foo()var f2 = new Foo()var o1 = {}var o2 = {}

在這里插入圖片描述

1. 2 執行上下文與執行上下文棧

1). 變量提升與函數提升

變量提升: 在變量定義語句之前, 就可以訪問到這個變量(undefined)
函數提升: 在函數定義語句之前, 就執行該函數
先有函數提升, 后有變量提升

2). 理解

執行上下文: 由js引擎自動創建的對象, 包含對應作用域中的所有變量屬性
執行上下文棧: 用來管理產生的多個執行上下文

3). 分類:

全局: window
函數: 對程序員來說是透明的

4). 生命周期

全局 : 準備執行全局代碼前產生, 當頁面刷新/關閉頁面時死亡
函數 : 調用函數時產生, 函數執行完時死亡

5). 包含哪些屬性:

全局 :
用var定義的全局變量 ==>undefined
使用function聲明的函數 ===>function
this ===>window
函數
用var定義的局部變量 ==>undefined
使用function聲明的函數 ===>function
this ===> 調用函數的對象, 如果沒有指定就是window
形參變量 ===>對應實參值
arguments ===>實參列表的偽數組

6). 執行上下文創建和初始化的過程

全局:
在全局代碼執行前最先創建一個全局執行上下文(window)
收集一些全局變量, 并初始化
將這些變量設置為window的屬性
函數:
在調用函數時, 在執行函數體之前先創建一個函數執行上下文
收集一些局部變量, 并初始化
將這些變量設置為執行上下文的屬性

1. 3 作用域與作用域鏈

在這里插入圖片描述

1). 理解:

作用域: 一塊代碼區域, 在編碼時就確定了, 不會再變化
作用域鏈: 多個嵌套的作用域形成的由內向外的結構, 用于查找變量

2). 分類:

  • 全局
  • 函數
  • js沒有塊作用域(在ES6之前)

3). 作用

作用域: 隔離變量, 可以在不同作用域定義同名的變量不沖突
作用域鏈: 查找變量

4). 區別作用域與執行上下文

作用域: 靜態的, 編碼時就確定了(不是在運行時), 一旦確定就不會變化了
執行上下文: 動態的, 執行代碼時動態創建, 當執行結束消失
聯系: 執行上下文環境是在對應的作用域中的

1. 4 閉包

在這里插入圖片描述

1). 理解:

當嵌套的內部函數引用了外部函數的變量時就產生了閉包
通過chrome工具得知: 閉包本質是內部函數中的一個對象, 這個對象中包含引用的變量屬性

2). 作用:

延長局部變量的生命周期
讓函數外部能操作內部的局部變量

3). 寫一個閉包程序

    function fn1() {var a = 2;function fn2() {a++;console.log(a);}return fn2;}var f = fn1();f();f();

4). 閉包應用:

循環遍歷加監聽: 給多個li加點擊監聽, 讀取當前下標
模塊化: 封裝一些數據以及操作數據的函數, 向外暴露一些行為
JS框架(jQuery)大量使用了閉包

5). 缺點:

變量占用內存的時間可能會過長
可能導致內存泄露
解決: 及時釋放 : f = null; //讓內部函數對象成為垃圾對象

1. 5 內存溢出與內存泄露

在這里插入圖片描述

1). 內存溢出

一種程序運行出現的錯誤
當程序運行需要的內存超過了剩余的內存時, 就出拋出內存溢出的錯誤

2). 內存泄露

占用的內存沒有及時釋放
內存泄露積累多了就容易導致內存溢出
常見的內存泄露:
意外的全局變量
沒有及時清理的計時器或回調函數
閉包

2.對象(高級)

在這里插入圖片描述

2.1 對象的創建模式

1). Object構造函數模式

	var obj = {}obj.name = 'Tom'obj.setName = function(name){this.name=name}

2). 對象字面量模式

	var obj = {name : 'Tom',setName : function(name){this.name = name}}

3). 構造函數模式

	function Person(name, age) {this.name = namethis.age = agethis.setName = function(name){this.name=name}}new Person('tom', 12)

4). 構造函數+原型的組合模式

	function Person(name, age) {this.name = namethis.age = age}Person.prototype.setName = function(name){this.name=name}new Person('tom', 12)

2. 2 繼承模式

1). 原型鏈繼承 : 得到方法

	function Parent(){}Parent.prototype.test = function(){}function Child(){}Child.prototype = new Parent() //子類原型指向父類的實例Child.prototype.constructor = Child //原型的構造器指向構造函數var child = new Child() child.test() //調用父類型的方法

2). 借用構造函數 : 得到屬性

	function Parent(xxx){this.xxx = xxx}Parent.prototype.test = function(){}function Child(xxx,yyy){Parent.call(this, xxx) //借用父類型的構造函數 相當于:this.Parent(xxx)}var child = new Child('a', 'b')  //child.xxx為'a', 但child沒有test()

3). 組合

	function Parent(xxx){this.xxx = xxx}Parent.prototype.test = function(){}function Child(xxx,yyy){Parent.call(this, xxx) //借用構造函數   this.Parent(xxx)}Child.prototype = new Parent() //得到test()Child.proptotype.constructor = Childvar child = new Child() //child.xxx為'a', 也有test()

2.3 理解

1). 定義一個函數背后做了什么?

創建一個Function的實例對象
給對象添加prototype屬性, 其值為object空對象(原型對象)
給原型對象添加constructor屬性, 指向當前函數對象

2). new一個對象背后做了些什么?

創建一個新的空對象
給對象設置__proto__, 值為構造函數對象的prototype屬性值
通過對象執行構造函數體(給對象添加屬性/方法)

本期推薦

很多粉絲問我對于學習Vue哪些書籍比較好,比較靠譜
今天小編為大家推薦這本 《Vue.js全家桶零基礎入門到進階項目實戰》
在這里插入圖片描述

本書貫穿入門準備實操、基礎核心案例、中級進階實戰、綜合進階項目進行講解,循序漸進、環環相扣,通俗易懂,并分析為什么這樣使用,讓你知其所以然。包含的主要技術:NPM/CNPM、VS Code、Vue.js、 MVVM、Axios、Vue Router、webpack、ECMAScript 6、Vue Loader、Vue CLI、Element UI、Vuex、 Mock.js、Easy Mock、ECharts 、Promise、攔截器、組件通信、跨域問題、上線部署等。
本書適合有 HTML、CSS、JavaScript 基礎的 Vue.js 零基礎小白、前端開發人員、后端開發人員。同時,也適合以下人員閱讀:在校生,需要掌握流行的新技術,做到與職場同步;在職人員,工作中需要學習使用Vue;有基礎學員,需要系統、全面、高效使用 Vue 技術。
本書優勢
1.技術全面、完整、系統—對標企業項目技術棧
2.講解詳細、通俗易懂——分析循序漸進且邏輯強
3.有學習討論交流群——快速成為前端工程師

購書渠道

渠道1點擊購買

渠道2點擊購買

寫在最后

?原創不易,還希望各位大佬支持一下\textcolor{blue}{原創不易,還希望各位大佬支持一下}

👍 點贊,你的認可是我創作的動力!\textcolor{green}{點贊,你的認可是我創作的動力!}

?? 收藏,你的青睞是我努力的方向!\textcolor{green}{收藏,你的青睞是我努力的方向!}

?? 評論,你的意見是我進步的財富!\textcolor{green}{評論,你的意見是我進步的財富!}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248501.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端處理跨域的幾種方式

什么是跨域&#xff1f; 跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源&#xff0c;這里跨域是廣義的。 廣義的跨域&#xff1a; 1、資源跳轉&#xff1a;A鏈接、重定向、表單提交 2、資源嵌入&#xff1a; <link>、<script>、<img>、<frame&g…

程序員必知的緩存套圖

文章目錄1. 線程與進程1.1 進程:1.2. 線程:1.3. 關系2. 瀏覽器內核模塊組成4. 事件循環機制5. 緩存5.1. 緩存理解5.2. 緩存分類5.3. 緩存使用示意圖5.4. 緩存中的header參數1. 線程與進程 1.1 進程: 進程是計算機中的程序關于某數據集合上的一次運行活動&#xff0c;是系統進…

安裝webpack及使用

前言 你是否也是只會運用框架中集成好的Webpack配置呢&#xff1f;你明白每一項的意義么&#xff1f;你懂多少Webpack的個性化配置項呢&#xff1f;本篇文章為你講解Webpack中的各種配置項參數及作用&#xff01; 文章目錄了解Webpack相關開啟項目編譯打包應用使用webpack配置…

Python基礎-os模塊 sys模塊

sys模塊 與操作系統交互的一個接口 文件夾相關 os.makedirs(dirname1/dirname2) 可生成多層遞歸目錄os.removedirs(dirname1) 若目錄為空&#xff0c;則刪除&#xff0c;并遞歸到上一級目錄&#xff0c;如若也為空&#xff0c;則刪除&#xff0c;依此類推os.mkdir(dirnam…

php單例型(singleton pattern)

搞定&#xff0c;吃飯 <?php /* The purpose of singleton pattern is to restrict instantiation of class to a single object. It is implemented by creating a method within the class that creates a new instance of that class if one does not exist. If an obje…

開啟關閉各種服務

開啟&關閉 Mac版 查找被占用的8080端口&#xff0c;根據pid殺掉進程 查找8080端口 losf -i:8080 根據pid殺掉進程 kill -9 pid iMac:~ acui$ lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 62948 ting 93u IPv6 0x6697d6…

助你提高效率的幾個Vue指令

前言 很多使用Vue的同學往往最容易忽略的指令&#xff0c;由于在這里考慮到很多初學甚至還沒有開始接觸Vue的同學呢&#xff0c;在介紹v-clos之前呢就先以大家都熟知的v-model編寫小demo v-model 相信大家對v-model并不陌生&#xff0c;簡單來講他就是用于在表單控件以及組建…

掌握Mock擺脫后端同學的束縛

文章目錄前言Mock概述mock.js安裝Mock規范Mock的使用總結前言 當下采用前后端分離模式開發Web應用已經成為氣候&#xff0c;在開發階段有一個不成文的規定則是 項目開發后端先行 但是作為前端開發工程師的我們&#xff0c;難道在搭建完頁面后只能等待后端的接口么&#xff1f;…

戶外鞋簡介

. 單論品牌&#xff08;主要以登山鞋及徙步鞋為主&#xff09;&#xff1a; 高級品牌&#xff1a;SCARPA、ASOLO、MONTRAIL、ZAMBERLAN、vasque、Lowa、La Sportiva 價格都較高&#xff0c;單價都在千元以上&#xff0c;品質一流&#xff0c;做工精細。 中檔品牌&#xff1a;Tr…

Vue技能樹上線啦

前言 前端現在越來越多樣化&#xff0c;語言眾多&#xff0c;大家使用的框架也比較雜&#xff0c;在廣泛的前端技術棧面前我唯愛Vue&#xff08;僅代表個人觀點勿噴小伙伴們&#xff09;可能很多人覺得我是因為簡單&#xff0c;其實并不然&#xff0c;我嘗試過很多框架&#x…

ES6的新特性(8)——數組的擴展

數組的擴展 擴展運算符 含義 擴展運算符&#xff08;spread&#xff09;是三個點&#xff08;...&#xff09;。它好比 rest 參數的逆運算&#xff0c;將一個數組轉為用逗號分隔的參數序列。 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[…

《SpringMVC從入門到放肆》一、概述

一、SpringMVC概述 ViewServiceDaoDBSpring MVCinterfaceinterfaceMysqlimplsimplsSpringMVC也叫Spring web mvc&#xff0c;屬于表現層框架。SpringMVC是Spring框架的一部分&#xff0c;是在Spring3.0后發布的。 二、第一個SpringMVC程序功能描述&#xff1a;  用戶提交一個…

手握流量密碼,萬粉不是夢

前言 可能大家來到CSDN的目的初衷都是不一樣的&#xff0c;像我注冊CSDN的時候完全是為了解決自己項目中的各種問題&#xff0c;能夠有一個為我提供正確答案、正確解決方案的一個平臺&#xff0c;簡單的了解后我選擇CSDN&#xff0c;直到成為現在的創作者也說明我的選擇是對的…

秋季學期學習總結

轉載于:https://www.cnblogs.com/zx666/p/10408950.html

一文帶你了解React框架

前言 由于 React的設計思想極其獨特&#xff0c;屬于革命性創新&#xff0c;性能出眾&#xff0c;代碼邏輯卻非常簡單。所以&#xff0c;越來越多的人開始關注和使用&#xff0c;認為它可能是將來 Web 開發的主流工具。 這個項目本身也越滾越大&#xff0c;從最早的UI引擎變成…

Web前端JQuery面試題(一)

Web前端JQuery面試題&#xff08;一&#xff09; 一&#xff1a;選擇器 基本選擇器 什么是#id&#xff0c;element&#xff0c;.class&#xff0c;*&#xff0c;selector1, selector2, selectorN&#xff1f;答&#xff1a; 根據給定的id匹配一個元素&#xff0c;用于搜索&…

前端云原生——微信小程序云服務配置

前端同樣涉及云原生前言創建使用云開發項目搭建云環境測試云服務1. 獲取openid&#xff08;上傳本地login云函數&#xff09;1.1 創建部署login文件時報錯2. 自定義sum函數并創建部署3. 上傳圖片4. 前端操作數據庫5. 即時通信demo面試法寶歡迎各位小伙伴們&#xff01; 為大家推…

45天帶你玩轉Node(第一天)初探Node.js

45天帶你玩轉Node 粉絲要求博主系統的寫一篇關于Node.js的學習資料&#xff0c;但其實我們的Node.js知識點并不少&#xff0c;所以博主為大家搭建了一個專欄&#xff0c;為了方便大家系統的學習Node.js&#xff0c;大家記得訂閱哦&#xff01;雖然我們的Node.js還很年輕&#…

VLC的一些接口

其他參考鏈接&#xff1a; 1、https://www.cnblogs.com/smartsensor/p/4343769.html /*Set the video scaling factor。 Zero is a special value; it will adjust the video to the outputwindow/drawable (in windowed mode) or the entire screen. */ 設置縮放系數 void li…

【轉載】 安卓版手機微信如何清理微信空間

在手機微信的使用過程中&#xff0c;隨著手機微信使用的時間越長&#xff0c;手機微信占用的空間越大&#xff0c;其實手機微信存儲了很多聊天記錄包括圖片、視頻等大文件信息&#xff0c;此時如果手機存儲空間比較緊張&#xff0c;可以使用微信自帶的清理工具對手機微信空間進…