js中的變量提高和函數提高

從上週開始,我所在的學習小組正式開始了angular的學習,angular是全面支持es6的,因此語法上和之前的angular有了很大的不一樣,好比變量聲明時就拋棄了var,而選擇了let和const;記得剛開始學習js的時候,使用webstrom時用var,webstrom會在下面畫一條小綠線,表示這個用法,問題不大,可是有點問題。由於webstrom推薦使用最新的標準,以後問過學長,他說這是es6的語法,暫時不用管,防止瀏覽器不兼容。html

終於,如今到了學習es6的時候。es6

const與let

const就是定義一個常量,即一個沒法改變的量。web

而let是一個更完善的var,之前的var是不完善的,他定義的變量是以函數爲範圍,而不是正常編程語言中的以一個大括號爲範圍,好比:編程

for(var i=0;i<10;i++){
          var a = 'a';
    }

    console.log(a);  // a

打印a時仍然會打印'a',如果一個沒接觸過js的人確定會大吃一驚,這就是一個最簡單的變量提高的例子。而let就解決了這個問題。它定義的變量就是塊級的。segmentfault

變量提高與函數提高

上面已經說了一個變量提高的最簡單的例子,下面介紹一下爲何:瀏覽器

一般JS引擎會在正式執行以前先進行一次預編譯,在這個過程當中,首先將變量聲明及函數聲明提高至當前做用域的頂端,而後進行接下來的處理

下面來講說函數提高,一樣的,讓咱們先看個例子:編程語言

function hoistFunction() {
    foo(); // output: I am hoisted

    function foo() {
        console.log('I am hoisted');
    }
}

hoistFunction();

函數能夠在聲明以前就能夠調用,這是由於引擎是把函數聲明整個地提高到了當前做用域的頂部,預編譯以後的大概代碼以下:函數

function hoistFunction() {
    function foo() {
        console.log('I am hoisted');
    }

    foo(); // output: I am hoisted
}

hoistFunction();

總結

變量提高和函數提高能夠遠比上面那個例子複雜,但對咱們意義並不大,畢竟對於變量已經有了完善的let定義方法,而函數提高,在能不用的狀況最好不用,畢竟他是不規範的,學習這個,只是爲了之後看到相關代碼時可以看懂,不然,看這種代碼時確定一臉懵逼。
(另外說一句,函數提高是專門設計的,有其特殊用途,而變量提高純粹是設計語言時的失誤,但二者都應該少用,畢竟都不規範,想要詳細瞭解,能夠點這裏學習

原文地址:http://www.javashuo.com/article/p-yggmfkos-cb.html設計

相關文章
相關標籤/搜索