函數的自執行,變量提高和函數提高

其實以前雖然剛開始學習JavaScript的時候常常看到function  add(){}、var add=function(){}、function(){}之類的這種寫法,可是具體是什麼叫什麼卻沒有去考慮過這個問題……函數

function add(){}這種寫法叫作函數聲明學習

var add=function(){}這種寫法叫作函數表達式spa

function(){}這種是匿名函數code

1、函數的自執行

那麼有沒有辦法讓它們不用經過咱們的調用好比blog

function add(){};
add();

就能夠自我執行呢?token

咱們來試試看這三種方法ip

//函數表達式自執行嘗試
var add=function(x,y){
    console.log(x+y);
}(5,6);     //結果:11(正確)
//函數聲明自執行嘗試
function add(x,y){
    console.log(x+y);
}(5,6);    //結果:沒法執行,也沒有拋出錯誤
//匿名函數自執行嘗試
function(){
    console.log(arguments[0]+arguments[1]);
}(5,6);     //結果:這個的問題就大了,拋出語法錯誤Uncaught SyntaxError: Unexpected token (

函數表達式後面加括號能夠當即執行函數,然而函數聲明卻不能夠!!io

很奇怪地,匿名函數也是函數表達式,可是它爲何會拋出語法錯誤呢?這是由於匿名函數雖然屬於函數表達式,可是很明顯它沒有賦值操做,JavaScript解析引擎會把它當作函數聲明,會跟你要一個函數名,可是它是匿名函數,確定沒有名字,JavaScript混了,直接給你個錯誤讓你檢討一下。console

那要怎麼解決匿名函數自執行這個問題?其實很簡單,只要告訴JavaScript解析器匿名函數不是函數聲明就行了。function

//加號
+function(){
    console.log(arguments[0]+arguments[1]);
}(5,6);
//減號
-function(){
    console.log(arguments[0]+arguments[1]);
}(5,6);
//感嘆號
!function(){
    console.log(arguments[0]+arguments[1]);
}(5,6);
//括號
(function(){
    console.log(arguments[0]+arguments[1]);
})(5,6);
(function(){
    console.log(arguments[0]+arguments[1]);
}(5,6));

接下來就是解決函數聲明自執行的問題了,其實方法跟匿名函數自執行的方法是同樣的,加號,減號,感嘆號,括號,均可以解決

!function add(x,y){
    console.log(x+y);
}(5,6);
+function add(x,y){
    console.log(x+y);
}(5,6);
-function add(x,y){
    console.log(x+y);
}(5,6);
(function add(x,y){
    console.log(x+y);
})(5,6);
(function add(x,y){
    console.log(x+y);
}(5,6));

2、變量提高、函數提高

函數聲明纔會提高,函數表達式是屬於變量提高

咱們先來看一下下面這段代碼的結果是什麼

console.log(a);
console.log(b);
console.log(c);
var a=1;
function b(){
    return 2;
}
var c=function(){
    return 3;
}

結果

console.log(c)的結果跟console.log(a)是同樣的,說明函數表達式是屬於變量提高的。這樣證實仍是有點草率,咱們再來看看下面的代碼

console.log(b());
console.log(c());
function b(){
    return 2;
}
var c=function(){
    return 3;
}

結果

結果很明顯了,函數c只是提高了變量名c而已,函數聲明纔會提高!

那麼變量的提高和函數聲明的提高哪一個提高的優先級比較高呢?

console.log(b);
console.log(b());
var b=1;
function b(){
    return 2;
}

結果

結果顯示函數聲明提高的優先級比變量提高還要高。

相關文章
相關標籤/搜索