成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

詳解函數(shù)與變量的聲明與提升

馬忠志 / 1421人閱讀

摘要:注意是前面,而不是最前面,因?yàn)樽兞柯暶魈嵘膬?yōu)先級別要低于函數(shù)聲明提升。分解后是這樣從以下代碼可以看出這也印證了變量聲明提升與變量定義分兩步走的結(jié)論。

函數(shù)聲明

定義函數(shù)有兩種方式: 一種是函數(shù)聲明,另一種是函數(shù)表達(dá)式。
函數(shù)聲明語法如下:

function functionName(arg0, arg1, arg2) {
    // 函數(shù)體
}
函數(shù)聲明提升

所謂的函數(shù)聲明提升,是指在一個(gè)作用域中,如果聲明了一個(gè)函數(shù),那么在代碼執(zhí)行的時(shí)候,會(huì)將這個(gè)聲明提升到整個(gè)作用域的最前面來執(zhí)行??聪旅娴睦?。

printString("hello world")

function printString(string) {
    console.log(string)
}

將代碼整體復(fù)制到控制臺,會(huì)打印出hello world。
再看函數(shù)內(nèi)部作用域:

function outer() {
    inner("hello world")
    
    function inner(string) {
        console.log(string)
    }
}
outer()  // hello world

這樣也得到了正確的輸出。

為什么在函數(shù)聲明之前就可以調(diào)用呢?就是因?yàn)楹瘮?shù)聲明提升。
所以,無論函數(shù)聲明被寫在所處作用域的哪里,都會(huì)被提升到這段代碼的最前面。

重復(fù)聲明函數(shù)

如果在已經(jīng)聲明了一個(gè)函數(shù)的情況下,聲明另一個(gè)同名函數(shù),將會(huì)覆蓋前面一個(gè)。

function b() {console.log(1)}
function b() {console.log(2)}
b()  // 2

上述代碼中,真正執(zhí)行的是后面聲明的函數(shù)。

函數(shù)聲明的實(shí)質(zhì)

函數(shù)聲明實(shí)質(zhì)上是定義了一個(gè)變量,該變量是Function的實(shí)例, 它指向了一個(gè)函數(shù)。

function newF() {
    console.log("hello")
}

console.log(typeof newF) //  "function"
console.log(newF instanceof Function) // true

這樣的話,就不難理解為什么聲明重名函數(shù),會(huì)覆蓋前面一個(gè)了,這相當(dāng)于重新給這個(gè)變量賦了一個(gè)值。

變量定義

定義一個(gè)變量的語法如下:

var a
var b

實(shí)際上是用var聲明了一個(gè)新的變量,變量被聲明時(shí)默認(rèn)值為undefined

變量聲明并初始化的實(shí)質(zhì)

這里說的變量聲明并初始化是指下面這種方式:

var a = 1;

實(shí)際上這行代碼是分兩步執(zhí)行的:

先聲明變量

var a = undefined;

給變量賦值

a = 1;

這也是為什么可以用一個(gè)變量給另一個(gè)變量做初始化的原因??聪旅娴拇a:

var b = 3;
var a = b
console.log(a) // 3

實(shí)際上分了四步:

聲明b: var b = undefined;

生命a: var a = undefined;

給b賦值: b = 3;

給a賦值: a = b;

變量聲明提升

變量的聲明也可以提升,也就是說JS在執(zhí)行時(shí),會(huì)把變量聲明的代碼提升到這個(gè)作用域代碼段的前面。注意:是前面,而不是最前面,因?yàn)樽兞柯暶魈嵘膬?yōu)先級別要低于函數(shù)聲明提升。
看下面代碼:

console.log(foo)
var foo = 3

執(zhí)行結(jié)果是undefined。實(shí)際執(zhí)行順序?yàn)?

var foo = undefined
console.log(foo)
foo = 3
重復(fù)聲明變量

如果聲明一個(gè)已經(jīng)聲明過的變量,JS會(huì)忽略第二次聲明。但是如果在聲明時(shí)給變量賦值,那么會(huì)覆蓋之前的值。

var foo1 = 3;
var foo1
console.log(foo1) // 3

拆開來看,是如下代碼:

var foo1 = undefined;
foo1 = 3;
var foo1 = undefined; // 這行代碼被忽略。不會(huì)執(zhí)行
console.log(foo1) // 3
聲明一個(gè)與函數(shù)聲明的名字相同的變量

如果聲明了一個(gè)變量,這個(gè)變量和某個(gè)函數(shù)聲明具有同樣的名字,那么也會(huì)忽略這個(gè)變量聲明。

function foo3() {}
var foo3
console.log(foo3)  // function foo3() {}

但是如果聲明變量時(shí)進(jìn)行了初始化就不一樣了,相當(dāng)于給變量重新賦值:

function foo3() {}
var foo3 = 3
console.log(foo3)  // 3
函數(shù)表達(dá)式

另一種定義函數(shù)的方式是函數(shù)表達(dá)式,語法如下:

var func = function(){
    console.log("hello")
}

實(shí)際上,這就是一個(gè)變量聲明并初始化的代碼。分解后是這樣:

var func = undefined;
func = function(){
    console.log("hello")
}

從以下代碼可以看出:

console.log(func) // undefined
var func = function(){}
console.log(func)  // function (){}

這也印證了變量聲明提升變量定義分兩步走的結(jié)論。

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/84045.html

相關(guān)文章

  • ES6 變量作用域提升變量生命周期詳解

    摘要:不同的是函數(shù)體并不會(huì)再被提升至函數(shù)作用域頭部,而僅會(huì)被提升到塊級作用域頭部避免全局變量在計(jì)算機(jī)編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎(chǔ)與實(shí)踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對象以及如何避免創(chuàng)建...

    lmxdawn 評論0 收藏0
  • JavaScript聲明變量詳解

    摘要:命令用于規(guī)定模塊的對外接口,命令用于輸入其他模塊提供的功能所以在一定程度上來說,也具有聲明變量的功能。當(dāng)沒有聲明,直接給變量賦值時(shí),會(huì)隱式地給變量聲明,此時(shí)這個(gè)變量作為全局變量存在。 前言 如果文章中有出現(xiàn)紕漏、錯(cuò)誤之處,還請看到的小伙伴多多指教,先行謝過 在ES5階段,JavaScript 使用 var 和 function 來聲明變量, ES6 中又添加了let、const、imp...

    paulquei 評論0 收藏0
  • 詳解JavaScript函數(shù)模式

    摘要:函數(shù)表達(dá)式又名匿名函數(shù)為變量賦的值是函數(shù)定義本身。在語言里任何匿名函數(shù)都是屬于對象。這種情況下,就叫做回調(diào)函數(shù)。如上面代碼示例展示了文檔單擊事件時(shí)以冒泡模式傳遞給回調(diào)函數(shù)的特別適用于事件驅(qū)動(dòng)編程,因?yàn)榛卣{(diào)模式支持程序以異步方式運(yùn)行。 JavaScript設(shè)計(jì)模式的作用是提高代碼的重用性,可讀性,使代碼更容易的維護(hù)和擴(kuò)展 在javascript中,函數(shù)是一類對象,這表示他可以作為參數(shù)傳遞...

    wwolf 評論0 收藏0
  • 詳解js變量聲明提升

    摘要:換句話說,在代碼執(zhí)行之前,會(huì)對作用域鏈中所有變量和函數(shù)聲明先處理完先??偨Y(jié)一句話就是只有聲明被提升,而賦值或其他運(yùn)算會(huì)留在原地。為其聲明變量隱性劫持到所在區(qū)域中。 之前一直覺會(huì)認(rèn)為javascript代碼執(zhí)行是由上到下一行行執(zhí)行的。自從看了《你不知道的JS》后發(fā)現(xiàn)這個(gè)觀點(diǎn)并不完全正確。先來給大家舉一個(gè)書本上的的例子: var a=hello world; var a; co...

    NSFish 評論0 收藏0
  • ES6語法詳解(一)

    摘要:凍結(jié)對象可以使用方法。對象的解構(gòu)賦值必須要屬性名相同,順序毫無影響。數(shù)組解構(gòu)賦值默認(rèn)值,當(dāng)?shù)忍栍疫叺闹禃r(shí),默認(rèn)值生效。 let變量 let聲明的變量在let命令所在的代碼塊中有效。不存在變量提升,只能先聲明后使用。 暫存死區(qū) 如果區(qū)塊中存在let和const命令,這個(gè)區(qū)塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量。 var a = 1; { ...

    wendux 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<