我正在关注AJAX的教程,制作视频的人做了一些奇怪的事情。至少我以前没见过。他们将对象属性设置为等于函数名称,但没有熟悉的()
。后来他继续定义了这个功能。代码在下面提供了上下文。无论如何,设置一个没有参数的函数是什么意思?这行代码确实正在运行名为的函数,如下所示。
xmlHTTP.onreadystatechange = handleServerResponse;
有一个名为“handleServerResponse()”的函数,该行实际运行。我可以发布它,但我认为这是无关紧要的。这只是一个正常的函数function handleServerResponse()
。任何解释将不胜感激!
谢谢!
〜Carpetfizz
编辑:将()
添加到该行的末尾,创建错误并更改错误。
答案 0 :(得分: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对象在就绪状态更改时使用的回调。在执行ajax请求的过程中,XHR对象将调用该函数。
更多例子:
// 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`)
答案 1 :(得分:1)
当请求的状态发生变化时(例如,当浏览器收到完整的答案时),浏览器将调用存储在onreadystatechange
的{{1}}属性中的函数。这个电话会像
xmlHttpRequest
将等同于
xmlHTTP.onreadystatechange();
要决定调用哪个函数,可以使用显示的行将此函数(不是此函数的返回值)分配给此属性。
这是可能的,因为JavaScript是一种函数被称为first class的语言:它们可能是属性值,就像对象,字符串等一样。
答案 2 :(得分: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";