摘要:簡介變量提升意味著變量和函數(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
摘要:所以形式參數(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); }; ...
摘要:有意思的是,這意味著變量在聲明之前甚至已經(jīng)可用。的這個(gè)特性被非正式地稱為聲明提前,即函數(shù)里聲明的所有變量但不涉及賦值都被提前至函數(shù)體的頂部。但實(shí)際上會(huì)將其看成兩個(gè)聲明和。第二個(gè)賦值聲明會(huì)被留在原地等待執(zhí)行階段。 簡介 JavaScript的函數(shù)作用域是指在函數(shù)內(nèi)聲明的所有變量在函數(shù)體內(nèi)始終是可見的。有意思的是,這意味著變量在聲明之前甚至已經(jīng)可用。JavaScript的這個(gè)特性被非正式地...
摘要:對(duì)于新手來說是最令人困惑的部分之一。函數(shù)聲明通過的形式。很明顯的,語言自身定義和函數(shù)形參已經(jīng)處于作用域頂端。這就意味著,函數(shù)聲明比變量聲明具有更高的優(yōu)先級(jí)。但是這卻不意味著對(duì)這個(gè)名稱的賦值無效,僅僅是聲明的部分會(huì)被忽略而已。 原文鏈接:JavaScript Scoping and Hoisting 你知道下面的JavaScript代碼執(zhí)行后會(huì)alert出什么值嗎? var foo = ...
摘要:輸出的結(jié)果為輸出的結(jié)果為提升后輸出的結(jié)果為重新定義了變量輸出的結(jié)果為如果定義了相同的函數(shù)變量聲明,后定義的聲明會(huì)覆蓋掉先前的聲明,看如下代碼輸出練習(xí)的值是多少的值是多少第二題的解析請(qǐng)看這里參考資料文章文章中文版鏈接文章推薦文章變量提升 JavaScript 變量聲明提升 原文鏈接 一個(gè)小例子 先來看個(gè)例子: console.log(a); // undefined var a =...
摘要:在中,有四種方式可以讓命名進(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 ...
閱讀 2154·2021-10-12 10:11
閱讀 851·2021-10-09 09:41
閱讀 3773·2021-09-09 11:37
閱讀 1950·2021-09-08 10:41
閱讀 2647·2019-08-30 12:58
閱讀 2376·2019-08-30 10:58
閱讀 1286·2019-08-26 13:40
閱讀 4126·2019-08-26 13:36