JS中var聲明與function聲明以及構造函數聲明方式的區別

 

JS中常見的三種函數聲明(statement)方式有這三種:express

// 函數表達式(function expression) 
var h = function () {
      // h
}

// 函數聲明(function declaration) 
function h() {
      // h
}
// 構造函數(function constructor)
function H() {
    // H 
}

 

先說三者的顯著區別:函數

第一種聲明方式也就是var聲明方式,函數表達式,又叫作函數字面量(Function Literals)、函數直接量(Function direct quantity), 函數只有在var語句聲明以後才能被調用spa

第二種聲明方式也就是function聲明方式,函數能夠在function聲明以前被調用.net

第三種聲明方式也就是構造函數聲明方式,函數能夠在function聲明以前被調用,不一樣於函數聲明的是構造函數的函數名首字母要大寫code

由於在函數預編譯過程當中,會將函數聲明總體提高,而對於var變量只會把var h進行提高,而後再在代碼運行階段進行賦值對象

對第一種狀況,函數表達式是在函數運行階段才賦值給變量hblog

對第二種狀況,函數聲明是在代碼運行階段以前,也就是代碼解析階段才賦值給標識符h原型鏈

對第三種狀況,構造函數也是在代碼運行階段以前,也就是代碼解析階段才賦值給標識符H作用域

爲了證實這種說法能夠看下面兩個例子:原型

對應第一種狀況,

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

console.log(h)  // function () {//h}
    
h = function () {
      // h1
}

console的結果是

undefined

ƒunction () {   // h }

由於賦值發生在代碼運行階段, 代碼自上而下運行console.log(h)所在位置只能獲取它以前的賦值

對應第二種狀況,第三種狀況,

console.log(h)  // function h() {//h}
function h() {
      // h
}

console.log(h)  // function h() {//h}
function h() {  
    // h1

}

console的結果是

ƒunction h() {
     // h1
}
ƒunction h() {
     // h1
}

由於賦值發生在代碼解析階段,代碼運行到console.log(h)時解析早已完成, 而解析的結果是後面那個函數h,故會打印此結果

深刻:

JS聲明函數的三種方式:

1. 函數表達式: 即上面第一種方式,這種方法使用function操做符建立函數,表達式能夠存儲在變量或者對象屬性裏。函數表達式每每被稱爲

匿名函數,由於它沒有名字。證實這一點你能夠 console.log(h.name); 能夠看到打印爲空 "",而h只是對函數的引用,不是函數名。

2. 函數聲明: 即上面第二種方式,會聲明一個具名函數,且函數能在其所在做用域的任意位置被調用,其建立的函數爲具名函數,證實這一

點你能夠 console.log(h.name); 能夠看到打印爲 "h"。 可在後面的代碼中將此函數經過函數名賦值給變量或者對象屬性

3. 構造函數function Fun(){}:不推薦這種用法,容易出問題,一般用於原型鏈中

 

深刻了解函數字面量和函數直接量:

https://blog.csdn.net/qq_25178609/article/details/51669870  https://blog.csdn.net/superhoy/article/details/52946157

相關文章
相關標籤/搜索