成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript 變量提升(Hoisting)

TwIStOy / 1554人閱讀

摘要:簡介變量提升意味著變量和函數(shù)的聲明會(huì)在物理層面移動(dòng)到代碼的最前面,但這么說并不準(zhǔn)確。實(shí)際上變量和函數(shù)聲明在代碼里的位置是不會(huì)動(dòng)的,而是在編譯階段被放入內(nèi)存中。

簡介
“變量提升”意味著變量和函數(shù)的聲明會(huì)在物理層面移動(dòng)到代碼的最前面,但這么說并不準(zhǔn)確。  
實(shí)際上變量和函數(shù)聲明在代碼里的位置是不會(huì)動(dòng)的,而是在編譯階段被放入內(nèi)存中。
聲明變量的方法

var、let、const
不用以上關(guān)鍵字直接賦值的變量會(huì)掛載與windows環(huán)境下;

let a=9
const a=1
var a=6
c=5
聲明函數(shù)的方法

javascript中聲明函數(shù)的方法有兩種:函數(shù)聲明式和函數(shù)表達(dá)式。

//函數(shù)聲明
function say(){
    console.log("hello") 
}

//函數(shù)表達(dá)式
var say=function (){
    console.log("hello") 
}
提升的好處
JavaScript 在執(zhí)行任何代碼段之前,將函數(shù)聲明放入內(nèi)存中的優(yōu)點(diǎn)之一是,這允許你可以在在聲明該函數(shù)之前使用一個(gè)函數(shù)。
/*** 正確的方式:先聲明函數(shù),再調(diào)用函數(shù) (最佳實(shí)踐)*/
function catName(name) {
    console.log("我的貓名叫 " + name);
}
catName("Tigger");
/*以上代碼的執(zhí)行結(jié)果是: "我的貓名叫 Tigger"*/


/*** 不推薦的方式:先調(diào)用函數(shù),再聲明函數(shù) */
catName("Chloe");
function catName(name) {
    console.log("我的貓名叫 " + name);
}
/*代碼執(zhí)行的結(jié)果是: "我的貓名叫 Chloe"*/
提升規(guī)則

var 聲明的變量,提升時(shí)只聲明,不賦值,默認(rèn)為undefined;不用關(guān)鍵字直接賦值的變量不存在提升(demo1)

函數(shù)提升會(huì)連帶函數(shù)體一起提升,不執(zhí)行;(deom2)

預(yù)解析的順序是從上到下;(demo4)

函數(shù)的優(yōu)先級(jí)高于變量,函數(shù)聲明提前到當(dāng)前作用域最頂端;(deom3)

變量重名,提升時(shí)不會(huì)重復(fù)定義;在執(zhí)行階段后面賦值的會(huì)覆蓋上面的賦值;(demo4)

函數(shù)重名,提升時(shí)后面的會(huì)覆蓋前面;(demo5)

函數(shù)和變量重名,提升函數(shù),不會(huì)重復(fù)定義,變量不會(huì)覆蓋函數(shù);在執(zhí)行階段后面賦值的會(huì)覆蓋上面的賦值;(demo8)

用函數(shù)表達(dá)式聲明函數(shù),會(huì)按照聲明變量規(guī)則進(jìn)行提升;(deom6)

函數(shù)執(zhí)行時(shí),函數(shù)內(nèi)部的變量聲明和函數(shù)聲明也按照以上規(guī)則進(jìn)行提升;(deom7)

let、const不存在提升;(demo9、demo10)

/**demo1**/
console.log("a=",a) //a=undefined
console.log("b=",b) // Uncaught ReferenceError: b is not defined
var a=1
b=6


/**deom2**/
console.log("a=",a)  // a=function  a() {console.log("func a()")}
function  a() {
console.log("func a()")
}

/**deom3**/
console.log("a=",a) // a=function  a() {console.log("fun a")}
var a=3
var a=4

function a(){
console.log("fun a")
}
var a=5
var a=6
console.log("a=",a) // a=6



/**deom4**/
console.log("a=",a)  // a=undefined
var a =2
console.log("a=",a) //
var a =3
var a =4
console.log("a=",a) // a=4
console.log("b=",b) //b= undefined
var b="b1"


/**deom5**/
console.log("a=",a) // a=function  a() {console.log("a2")}
function a(){
console.log("a1")
}
function a(){
console.log("a2")
}
console.log("a=",a) // a=function  a() {console.log("a2")}


/**deom6**/
console.log("a=",a) // a=undefined
var a=function(){console.log("a1")}
var a=3
var a=4
var a=5
console.log(a)
var a=function(){console.log("a2")}
console.log("a=",a) // a= ? (){console.log("a2")}


/**deom7**/
console.log("b=",b)
var a=3
function b(i){
    console.log("a=",a)
    var a=4
    function a(){
        console.log("fun a")
    }
    console.log("a=",a)
}
b()


/**demo8**/
console.log("a=",a) //a= function a(){ console.log("fun a")}
var a=2
function a(){
    console.log("fun a")
}
console.log("a=",a) // a=2
var a=3
var a=4
var a=5
console.log("a=",a) // a=5


/**demo9**/
console.log("a=",a) //Uncaught ReferenceError: a is not defined
let a=4


/****/

console.log("b=",b) // Uncaught ReferenceError: b is not defined
const b=5

參考資料
MDN

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109125.html

相關(guān)文章

  • 理解 JavaScript(二)

    摘要:所以形式參數(shù)是本地的,不是外部的或者全局的。這叫做函數(shù)聲明,函數(shù)聲明會(huì)連通命名和函數(shù)體一起被提升至作用域頂部。這叫做函數(shù)表達(dá)式,函數(shù)表達(dá)式只有命名會(huì)被提升,定義的函數(shù)體則不會(huì)。 Scoping & Hoisting var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; ...

    luxixing 評(píng)論0 收藏0
  • (深究)聲明提前(Hoisting)

    摘要:有意思的是,這意味著變量在聲明之前甚至已經(jīng)可用。的這個(gè)特性被非正式地稱為聲明提前,即函數(shù)里聲明的所有變量但不涉及賦值都被提前至函數(shù)體的頂部。但實(shí)際上會(huì)將其看成兩個(gè)聲明和。第二個(gè)賦值聲明會(huì)被留在原地等待執(zhí)行階段。 簡介 JavaScript的函數(shù)作用域是指在函數(shù)內(nèi)聲明的所有變量在函數(shù)體內(nèi)始終是可見的。有意思的是,這意味著變量在聲明之前甚至已經(jīng)可用。JavaScript的這個(gè)特性被非正式地...

    陳偉 評(píng)論0 收藏0
  • [翻譯] JavaScript Scoping and Hoisting

    摘要:對(duì)于新手來說是最令人困惑的部分之一。函數(shù)聲明通過的形式。很明顯的,語言自身定義和函數(shù)形參已經(jīng)處于作用域頂端。這就意味著,函數(shù)聲明比變量聲明具有更高的優(yōu)先級(jí)。但是這卻不意味著對(duì)這個(gè)名稱的賦值無效,僅僅是聲明的部分會(huì)被忽略而已。 原文鏈接:JavaScript Scoping and Hoisting 你知道下面的JavaScript代碼執(zhí)行后會(huì)alert出什么值嗎? var foo = ...

    FingerLiu 評(píng)論0 收藏0
  • JavaScript 變量聲明提升

    摘要:輸出的結(jié)果為輸出的結(jié)果為提升后輸出的結(jié)果為重新定義了變量輸出的結(jié)果為如果定義了相同的函數(shù)變量聲明,后定義的聲明會(huì)覆蓋掉先前的聲明,看如下代碼輸出練習(xí)的值是多少的值是多少第二題的解析請(qǐng)看這里參考資料文章文章中文版鏈接文章推薦文章變量提升 JavaScript 變量聲明提升 原文鏈接 一個(gè)小例子 先來看個(gè)例子: console.log(a); // undefined var a =...

    fireflow 評(píng)論0 收藏0
  • JS基礎(chǔ)篇--函數(shù)聲明與定義,作用域,函數(shù)聲明與表達(dá)式的區(qū)別

    摘要:在中,有四種方式可以讓命名進(jìn)入到作用域中按優(yōu)先級(jí)語言定義的命名比如或者,它們?cè)谒凶饔糜騼?nèi)都有效且優(yōu)先級(jí)最高,所以在任何地方你都不能把變量命名為之類的,這樣是沒有意義的形式參數(shù)函數(shù)定義時(shí)聲明的形式參數(shù)會(huì)作為變量被至該函數(shù)的作用域內(nèi)。 Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var ...

    TerryCai 評(píng)論0 收藏0
  • JavaScript中的變量提升(Hoisting)

    譯者按: let和var對(duì)于變量提升的影響不同。 原文: What is Hoisting

    Mr_houzi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<