一道面試題讓你與JS更近一步

来源:http://www.cnblogs.com/similar/archive/2016/03/18/5292926.html
-Advertisement-
Play Games

這是一道面試題, 請先思考,在看講解 :) 講解如下: 1. main() , 列印的結果為: undefined , 1 a. > 來看第一個列印的值為什麼是 undefined。 在js中,方法和變數的聲明都是會提前的。也就是說不管你在何處聲明的方法或者變數,在js解析時,都會將其提前,具體看代


這是一道面試題, 請先思考,在看講解 :)

var param = 1;

function main()
{    
    console.log(param);
    var param = 2;
    console.log(this.param);
    this.param = 3;
}

//下麵兩條語句分別會在控制台列印什麼?
main();
var m = new main();

 

講解如下:

1. main() , 列印的結果為: undefined1

 

a. >  來看第一個列印的值為什麼是 undefined。 在js中,方法和變數的聲明都是會提前的。也就是說不管你在何處聲明的方法或者變數,在js解析時,都會將其提前,具體看代碼

demo(); //此處能正常彈出 similar

function demo()
{
    alert("similar");
}

按照js的語句執行順序,應該是從上自下依次執行的。 也就是說會先執行demo(), 然而這個時候demo()還沒有聲明,並不存在,應該報錯才對,為什麼還能正常彈出similar呢?這就前面說的方法聲明在js解析時會提前。所以上面的代碼,經過解析之後,就相當於

function demo()
{
    alert("similar");
}

demo(); //此處能正常彈出 similar

所以才會正常彈出 similar。 那麼對於變數的聲明也是一樣的,會提前。 我們上面的代碼,經過解析之後實際上等同於下麵的代碼

var param; //聲明提前
param = 1;

function main()
{
    var param; //聲明提前
    console.log(param); //因為此時 param 只是進行了聲明,並未賦值,所以 列印的是 undefined
    param = 2;
    console.log(this.param);
    this.param = 3;
}

這裡你或許會感到疑惑。我們在main()方法外面不是已經賦值為1了嗎?  這是因為,我們在main()方法裡面也定義了一個同名的 param。 就近原則,js會先查找自己有沒有這個變數,如果有,就用自己的,如果沒有就向上級查找,上級還是沒有就到上上級去查找,如此迴圈,在哪找到,就在哪停止。如果全都沒有,就返回undefined。 【這裡涉及到一個知識點: js作用域鏈及變數查找, 之後我會寫一篇於此相關的講解文章】

 

b. > 現在我們再來看看第二列印的值為什麼是1。 我將代碼再做一次等價轉換,這樣或許大家就更容易明白緣由了,轉換後代碼如下

window.param = 1; //全局變數 param

// 全局方法 main()
window.main = function () {
    console.log(param);
    var param = 2;
    console.log(this.param);  //此時的this指代的就是 window, 因此 this.param = window.param = 1
    this.param = 3;
}

//調用全局方法main() window.main();

看到這裡,大家是否有些明白了呢?因為 main() 方法和 main() 方法外面的 param 都是定義在最外層的(沒有包裹在其他對象裡面),因此他們都是全局對象window下的成員。 當我們調用 main() 方法時, 實際上就是調用的 window.main();  而通過這樣的方式調用時, this 指代的就是全局對象 window。 所以第二個列印的值為 1。【這裡涉及到一個知識點: js中讓人迷糊的this,之後我會寫一篇於此相關的講解文章】

 

2. var m = new main(), 列印的結果為: undefinedundefined

 

a. > 第一個列印的值為 undefined 的原因和上面的原因是一樣的,都是因為變數聲明提前導致的。

 

b. > 那麼第二個列印的值也為 undefined 的原因是什麼呢? Js也是支持面向對象式編程的語言,然而js中卻沒有類的概念,而是使用基於原型(prototype)的繼承。 因此呢,js中的構造函數也很特別,一般情況下它和普通方法沒什麼區別,只有通過 new 關鍵字來調用的時候才能體現出其作為構造函數的功能。 而此處正是把 main() 和 new 關鍵字一起使用,說明此時的main()是一個構造函數。而構造函數中的 this 指代的就是新創建的對象,那麼也就是 m 。

var param = 1;

function main()
{
    var param; //聲明提前
    console.log(param); //因為此時 param 只是進行了聲明,並未賦值,所以 列印的是 undefined
    param = 2;
    console.log(this.param); //構造函數中的this指代的是新創建的對象,我們這裡新創建的對象是 m , 所以 this.param = m.param , 而此時 this.param 尚未賦值,所以列印的是 undefined (此處我自己也有一個疑問: 構造函數中的屬性的聲明會提前嗎?也就是 this.param 的聲明會提前嗎? 求解)
    this.param = 3;
}

var m = new main();

說到底這裡還是一個關於 js 中 this 的理解的問題,掌握了this , 此問題就很好理解了。現在都知道各中緣由了,是不是有種豁然開朗的感覺,哈哈...


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

-Advertisement-
Play Games
更多相關文章
  • 先看效果: 方圖(w=h) 豎圖(h>w) 橫圖(w>h) 使用說明: // <![CDATA[ $(function(){ var zs=$(".zoom"); //添加放大鏡和影布 zs.append("<i class='magnifier'>"); zs.wrapInner("<sectio
  • 在 CSS 樣式定義中,以下哪種 RGB 顏色值是 Web 安全色? A]#111111B]#222222C]#333333D]#444444 答案:http://hovertree.com/tiku/bjaf/72jaf1n0.htm 解析:http://hovertree.com/h/bjaf/
  • [1]定義 [2]屬性 [3]失效 [4]應用
  • ExtJS為開發者在開發富客戶的B/S應用中提供豐富的UI組件,具有統一的主題,便於快速開發,提高效率。但顯然它並不適合互聯網站的開發。 一、主要目錄文件介紹 builds:壓縮後的ExtJS代碼,體積更小,更快; docs:開發文檔; examples:官方演示示例; locale:多國語言資源文...
  • html css
  • 自誕生之初截止目前(2016年初),React可以說是前端界最流行的話題,如果你還不知道React是何物,你就該需要充充電了。 d3是由紐約時報工程師開源的一個繪製基於svg的數據可視化工具,是近幾年最流行的visualization工具庫之一。d3提供豐富的svg繪製API、動畫甚至佈局等功能,目
  • 最近公司網站在谷歌,火狐上測試都沒有問題,但是在ietest,ie6上出現相容問題 ,由於ietest好幾次打開ie6都報錯(嘗試卸載重新安裝幾次無果),下載virtualbox安裝自帶ie6的xp系統,進行ie6測試,打開各大公司網站總是關閉,懷疑可能是xp的iso鏡像問題,於是又重新下載裝了第二
  • 斷斷續續的把慕課的JavaScript基礎和進階看完了,期間不怎麼應用有的都忘記了,接下來多開始寫些效果,進行實際應用。 製作一個表格,顯示班級的學生信息。 1. 滑鼠移到不同行上時背景色改為色值為 #f2f2f2,移開滑鼠時則恢復為原背景色 #fff 2. 點擊添加按鈕,能動態在最後添加一行 3.
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...