web前端經典小題

来源:http://www.cnblogs.com/youtian/archive/2017/11/19/7860095.html
-Advertisement-
Play Games

1.此題涉及的知識點眾多,包括變數定義提升、this指針指向、運算符優先順序、原型、繼承、全局變數污染、對象屬性及原型屬性優先順序等等。 function Foo() { getName = function () { console.log(1) }; return this; } Foo.getNa ...


1.此題涉及的知識點眾多,包括變數定義提升、this指針指向、運算符優先順序、原型、繼承、全局變數污染、對象屬性及原型屬性優先順序等等。 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();

答案如下:

Foo.getName();//2

getName();//4

Foo().getName();//1

getName();//1

new Foo.getName();//2

new Foo().getName();//3

new new Foo().getName();//3

解析:先看此題,1.首先創建了一個Foo的函數,2.之後又為Foo創建了一個叫getName的靜態屬性存儲了一個匿名函數,3.之後為Foo的原型創建了一個名叫getName的匿名函數。4.之後又通過函數變數表達式創建了一個getName的函數,5.最後再聲明一個叫getName函。

第一問:自然是訪問Foo上的靜態屬性,是2.

第二問:此處有兩個坑,一是變數聲明提升,二是函數表達式

以上問題代碼可以等價於:

function Foo() { getName = function () { console.log(1) }; return this; } function getName() { console.log(5) };//先提升函數聲明 var getName;//然後提升變數,不會賦值 Foo.getName = function () { console.log(2) }; Foo.prototype.getName = function () { console.log(3) }; getName = function () { console.log(4) }; 最後執行getName()時自然輸出的是4.   第三問:先執行Foo(),首先在Foo函數的作用域里尋找變數getName,沒有找到就到全局作用域里去尋找,找到了把getName重新賦值了一個匿名函數,最後返回的是window,相當於執行window.getName(),自然結果是1;   第四問:此時已經把變數getName存儲了function () { console.log(1) }的匿名函數。所以結果為1;   後面的就牽扯到運算,優先順序從高到底排序的,可以參考https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

 

第五問:點.的運算符高於new所以相當於new (Foo.getName());訪問對象Foo的靜態屬性getName(),實際上把getName當作構造函數,結果為2;   第六問: new Foo().getName(),括弧()的優先順序高於new, 相當於(new Foo()).getName();

構造函數的返回值

在傳統語言中,構造函數不應該有返回值,實際執行的返回值就是此構造函數的實例化對象。

而在js中構造函數可以有返回值也可以沒有。

1、沒有返回值則按照其他語言一樣返回實例化對象。

2、若有返回值則檢查其返回值是否為引用類型。如果是非引用類型,如基本類型(string,number,boolean,null,undefined)則與無返回值相同,實際返回其實例化對象。

3、若返回值是引用類型,則實際返回值為這個引用類型。

原題中,返回的是this,而this在構造函數中本來就代表當前實例化對象,遂最終Foo函數返回實例化對象。

之後調用實例化對象的getName函數,因為在Foo構造函數中沒有為實例化對象添加任何屬性,遂到當前對象的原型對象(prototype)中尋找getName,找到了。

遂最終輸出3。

第七問: new new Foo().getName(),相當於new ((new Foo()).getName)();先初始化Foo的實例化對象,然後將其原型上的getName函數作為構造函數再次new;   參考:http://mp.weixin.qq.com/s/eO5hL0pcEHYr7jAbWTWAXg          

      


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在學習廖雪峰前輩的JavaScript教程中,遇到了一些需要註意的點,因此作為學習筆記列出來,提醒自己註意! 如果大家有需要,歡迎訪問前輩的博客https://www.liaoxuefeng.com/學習。 比較運算符 當我們對Number作比較時,可以通過比較運算符得到一個布爾值,這是我們預期的結 ...
  • 在學習廖雪峰前輩的JavaScript教程中,遇到了一些需要註意的點,因此作為學習筆記列出來,提醒自己註意! 如果大家有需要,歡迎訪問前輩的博客https://www.liaoxuefeng.com/學習。 JavaScript的字元串就是用 ' ' 或者 “ ” 括起來的字元表示。 如果字元串內部 ...
  • Vue2.0和1.0實現路由的方法有差別,現在我用Vue 2.0實現路由跳轉,話不多說,直接上代碼 HTML代碼 main.js 代碼 ...
  • Point類除了構造方法,還定義了一個toString方法。註意,定義“類”的方法的時候,前面不需要加上function這個關鍵字,直接把函數定義放進去了就可以了。另外,方法之間不需要逗號分隔,加了會報錯。 Point類除了構造方法,還定義了一個toString方法。註意,定義“類”的方法的時候,前 ...
  • 絮叨絮叨 今天給大家分享一下這兩天自己整理的JavaScript部分的筆記,下麵都是我覺得比較常用的,希望能幫助到大家! 1、 導入JS的三種方式 ①在HTML標簽中,直接內嵌JS。<button onclick=”func()”></button> ②在HTML頁面中使用<script></scr ...
  • 目的:在提交表單之前用JavaScript檢查下是不是圖片文件以及大小 註:match() 方法可在字元串內檢索指定的值,或找到一個或多個正則表達式的匹配。該方法類似 indexOf() 和 lastIndexOf(),但是它返回指定的值(存放匹配結果的數組),而不是字元串的位置。 ...
  • 1)Array.slice方法 1.1)接收兩個參數: a:起始下標 b:結束下標 1.2)返回由a(包括)至b(不包括)的元素所組成的數組,若一個參數都不傳,則返回由全部元素組成的數組。 1.3)該方法執行不影響原數組元素。 1.4)範例圖: 2)Array.splice方法 2.1)接收若幹參數 ...
  • 本篇是關於手寫代碼的題目。 1.實現一個trim函數 關於性能的寫法也不多說了,只是用最直觀的寫法來寫一下,使用正則有大概五六種寫法,感興趣可以自己去研究下,推薦《高性能JavaScript》 1.正則實現 trim leftTrim rightTrim 2.非正則實現 trim leftTrim ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...