【问题标题】:Setting a variable equal to a function without parenthesis? [duplicate]将变量设置为等于没有括号的函数? [复制]
【发布时间】:2013-07-27 19:34:52
【问题描述】:

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

xmlHTTP.onreadystatechange = handleServerResponse; 

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

编辑:将() 添加到该行的末尾,会产生错误并对其进行更改。

【问题讨论】:

    标签: javascript ajax


    【解决方案1】:

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

    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`
    

    函数是对象这一事实很自然地得出结论,但值得特别指出的是,上面的xfoo 之间没有神奇的联系;它们都是指向同一个函数的变量。除了它们指向同一个函数之外,它们没有以任何方式链接,并且更改一个(例如指向另一个函数)对另一个没有影响。示例:

    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`)
    

    【讨论】:

    • 您可能想进一步说明,在做x=foo 之后,您可以稍后再做x()
    • @BryanOakley:我确实做到了。 :-)
    • 可能还值得注意的是,如果您在将foo 函数分配给x 后更改它,x 函数仍将是相同的(它不会在分配后继承更改)。
    • 非常感谢您的回答。我也从@dystroy 那里学到了很多东西,但这个答案对于未来搜索我的问题标题的读者来说更为普遍。
    【解决方案2】:

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

    xmlHTTP.onreadystatechange();
    

    这将等同于

    handleServerResponse();
    

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

    这是可能的,因为 JavaScript 是一种语言,其中函数被称为 first class:它们可能是属性值,就像对象、字符串等。

    【讨论】:

      【解决方案3】:

      这意味着您正在为变量分配对该函数的引用。然后可以使用引用来调用该函数。像这样的……

      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";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-23
        • 1970-01-01
        • 2022-01-20
        • 2022-06-10
        • 2015-08-11
        • 1970-01-01
        相关资源
        最近更新 更多