2013-07-27 34 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"; 
相关问题