3

我正在关注 AJAX 的教程,制作视频的人做了一些奇怪的事情。至少我以前没见过。他们将对象属性设置为等于函数名称,但没有熟悉的(). 他后来继续定义该功能。下面提供了代码作为上下文。无论如何,设置等于没有参数的函数是什么意思?那行代码确实在运行名为该函数的函数,如下所示。

xmlHTTP.onreadystatechange = handleServerResponse; 

有一个名为“handleServerResponse()”的函数,该行实际运行。我可以发布它,但我认为这无关紧要。这只是一个正常的功能function handleServerResponse()。任何解释将不胜感激!谢谢!~地毯嘶嘶声

编辑:添加()到该行的末尾,会产生错误,以及更改它。

4

3 回答 3

9

他们在那里所做的是引用该函数而不调用它。

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`)
于 2013-07-27T11:10:14.933 回答
1

当请求的状态发生变化时(例如当浏览器收到完整的答复时),浏览器将调用存储在onreadystatechange.properties 属性中的函数xmlHttpRequest。这个电话将类似于

xmlHTTP.onreadystatechange();

这将相当于

handleServerResponse();

要决定将调用哪个函数,请使用显示的行将此函数(不是此函数的返回值)分配给此属性。

这是可能的,因为 JavaScript 是一种将函数称为第一类的语言:它们可能是属性值,就像对象、字符串等一样。

于 2013-07-27T11:10:49.970 回答
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";
于 2013-07-27T11:10:57.963 回答