2016-08-05 96 views
-3

據我所知,JS是函數作用域的,而不是作用域的範圍,這意味着在(括號內)聲明的對象不會創建不同的執行上下文。但是:爲什麼你不能調用括號內聲明的函數?

$('#firstBtn').click(function first() { 
    console.log("first activated"); 
}); 

$('#secondBtn').click(function() { 
    console.log("second activated"); 
    first(); 
}); 

返回Reference Error function is undefined。函數first正在括號內聲明,所以從技術上講,它應該可用於其他函數,該函數從它聲明的範圍調用它。

但這個工程:

var callDat = $('#firstBtn').click(function first() { 
    console.log("first activated"); 
}); 

$('#secondBtn').click(function() { 
    console.log("second activated"); 
    callDat.first(); 
}); 

我的假設是,由於對象是函數,聲明一個對象內部的功能可以算作聲明不同的功能範圍內,即使沒有大括號。然而,我希望對此有一個明確的答案。

+1

在'函數first(){''first''是從它自己調用函數時創建的別名。 'first'不能從'first'之外訪問。 – Tushar

+1

看看[命名函數表達式揭祕](https://kangax.github.io/nfe/)。命名函數表達式!==函數聲明。對於第二個例子,你跳到完全錯誤的結論。 –

+0

我的不好,第二個例子不起作用。然而,在我提出「解決方案」之前,我已經考慮過這個問題,所以我認爲它不應該被刪除,雖然可能是爲了不讓更多的讀者分心我的原始查詢。 –

回答

5

在第二個示例中,您得到的first不是您之前聲明的那個 - 它對所有jQuery對象都可用的jQuery.first方法。

這是可檢查 - 單擊下面的「第一個」,然後「第二個」不會輸出「第一次激活」從點擊第二個按鈕。

var callDat = $('#firstBtn').click(function first() { 
 
    console.log("first activated"); 
 
}); 
 

 
$('#secondBtn').click(function() { 
 
    console.log("second activated"); 
 
    callDat.first(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button id="firstBtn">First</button> 
 

 
<button id="secondBtn">Second</button>

4

返回引用錯誤的功能是不確定的。該函數首先在括號內聲明,因此在技術上它應該可用於其他函數,這些函數從它聲明的範圍調用它。

編號函數聲明在它們聲明的範圍內創建一個變量,它與該函數具有相同的名稱。函數表達式不會,即使它們是,也可以命名爲函數表達式。 (命名函數表達式在其範圍內創建該名稱的變量)。

延伸閱讀:JavaScript function declaration syntax: var fn = function() {} vs function fn() {}

我的假設是,由於對象是功能,

函數是對象。反過來並不一定是真的。

聲明對象內部的功能可以算作聲明不同的功能範圍內,即使沒有大括號

不,不能。

+0

我已經閱讀過那篇文章,並且我對此有所瞭解。你回答我的第二個例子 - 但第一個呢?兩者都是宣佈的功能。 –

+3

@BarAkiva - 都不是函數聲明。你只有函數表達式。 – Quentin

0

這是一個「函數字面量」或「函數表達式」,它只有返回函數的值爲,但未在周圍的函數範圍中將其定義爲變量。但它確實有其自己的範圍。請參閱下面我摘錄的東西很有意思:

var counter = 0; 
 

 
// function "b" is acting as a value to be given to "a" 
 
var a = function b() { 
 

 
    alert(counter); 
 

 
    counter++; 
 

 
    // both "b" and "a" are accessible in here 
 
    if(counter < 3) b(); 
 

 
}; 
 

 
a(); // only a is accessible here

,因爲它不是從語法,形式明顯...

function func() { ... } 

...可以被替代以下更清楚:

var func = function() { ... }; 
1

在第一個例子mple你居然創建範圍 - 這一點:

$('#firstBtn').click(function first() { 
    console.log("first activated"); 
}); 

實際上是這樣的:

(function first() { 
    console.log("first activated"); 
}) 

,因此是不是其他範圍

可現在 - 如果你」我聲明它是這樣的:

function first() { 
    console.log("first activated"); 
} 

$('#firstBtn').click(first); 

$('#secondBtn').click(function() { 
    console.log("second activated"); 
    first(); 
}); 

你不會得到錯誤

相關問題