2013-07-27 35 views
3

我正在關注AJAX教程,製作視頻的人做了一些奇怪的事情。至少我以前沒有見過它。他們設置一個對象屬性等於一個函數名稱,但沒有熟悉的()。他後來繼續定義函數。代碼在上下文中提供。無論如何,在沒有參數的情況下設置某個函數的含義是什麼意思?該行代碼確實正在運行名爲的函數,如下所示。設置一個變量等於一個沒有括號的函數?

xmlHTTP.onreadystatechange = handleServerResponse; 

有一個名爲「handleServerResponse()」的函數,該行實際運行。我可以發佈它,但我認爲它是無關緊要的。這只是一個正常的功能function handleServerResponse()。任何解釋將不勝感激! 謝謝! 〜Carpetfizz

編輯:將()添加到該行的末尾,創建錯誤以及更改它。

回答

8

他們在那裏做的是參考來函數沒有它。

var x = foo; // Assign the function foo to x 
var y = foo(); // Call foo and assign its *return value* to y 

在JavaScript中,函數是對象。適當的對象。所以你可以傳遞給他們參考。

在這種特定情況下,他們正在設置handleServerResponse作爲XHR對象在就緒狀態更改時使用的回調。 XHR對象將在執行ajax請求的過程中調用該函數。

一些例子:

// Declare a function 
function foo() { 
    console.log("Hi there"); 
} 

// Call it 
foo();  // Shows "Hi there" in the console 

// Assign that function to a varible 
var x = foo; 

// Call it again 
x();   // Shows "Hi there" in the console 

// Declare another function 
function bar(arg) { 
    arg(); 
} 

// Pass `foo` into `bar` as an argument 
bar(foo);  // Shows "Hi there" in the console, because `bar` 
       // calls `arg`, which is `foo` 

它從一個事實,即函數對象自然如下,但它是值得的呼喚特別是有x並在上面foo之間沒有神奇的聯繫;它們都只是指向相同功能的變量。除了它們指向相同的功能外,它們沒有以任何方式鏈接,而改變它(例如指向另一個功能)對另一個功能沒有影響。例如:

var f = function() { 
    console.log("a"); 
}; 

f(); // "a" 

var x = f; 

x(); // "a" 

f = function() { 
    console.log("b"); 
}; 

f(); // "b" 
x(); // "a" (changing `f` had no effect on `x`) 
+2

您可能想進一步解釋,在執行'x = foo'後,您可以稍後執行'x()'。 –

+1

@BryanOakley:我確實。 :-) –

+2

也可能值得注意的是,如果您在將'foo'函數賦值給'x'後,'x'函數仍然是相同的(它不會繼承賦值後的更改)。 – David

1

當的請求的狀態改變(例如,當瀏覽器接收到的完整的答案),瀏覽器將調用存儲在xmlHttpRequestonreadystatechange屬性的功能。這個調用會像

xmlHTTP.onreadystatechange(); 

這將只是相當於

handleServerResponse(); 

決定哪些功能將被調用,您分配此功能(不是這個函數的返回值),這個屬性使用你顯示的線。

這是可能的,因爲JavaScript是其中功能說first class語言:他們可能是屬性值,就像對象,字符串等

1

這意味着你要分配變量到函數的引用。然後可以使用該引用來調用該函數。像這樣的東西...

function foo(){ 
    alert("I am inside foo"); 
} 

var bar = foo; // bar now points to foo 

// Call foo 
foo();// alerts "I am inside foo"; 

// Call bar which is pointing to foo 
bar();// alerts "I am inside foo"; 
相關問題