【问题标题】:Does the var becomes a function because of a javascript function stored in a var?var 是否因为存储在 var 中的 javascript 函数而成为函数?
【发布时间】:2013-09-05 18:41:46
【问题描述】:

在下面关于Scope 的示例中,我不明白变量如何作为函数运行?在这里var ff() 运行。但是,这是在 JavaScript 中运行 f 的合理方法吗?为什么?是不是因为var f存储了一个函数?

var myFunction = function() {
  var foo = "hello";
  var myFn = function() {
    console.log( foo );
  };
  foo = "ddd";
  return myFn;
};
var f = myFunction();
f(); // "ddd"

谢谢!

【问题讨论】:

    标签: javascript jquery scope


    【解决方案1】:

    这行代码将运行函数myFunction并将其返回值赋给f。

    var f = myFunction();
    

    myFunction 返回对函数myFn 的引用。因此,f 现在是对myFn 的引用,当您尝试使用f() 调用f 时,它会调用myFn,因为这是引用指向的位置。

    jsFiddle Demo

    有一种类似的方法可以返回一个带有函数的对象

    var init = function(){
     return {
      hello: function(){ console.log("hello"); },
      world: function(){ console.log("world"); }
     };
    };
    

    然后可以这样使用:

    var f = init();
    f.hello();
    f.world();
    

    【讨论】:

    • 什么是“参考点”?是因为它的第一个变量是 myFunction() 的函数吗?
    • @Chen - 在 javascript 中,引用是指针。因此,当您返回一个函数时,您将返回一个指向该函数的指针。从本质上讲,这意味着无论分配什么,该指针都会像myFunction 一样起作用。
    【解决方案2】:

    在一般的脚本语言和函数式编程中。您可以像使用变量一样使用函数。例如:在这两种范式中,通常(不知道任何不知道的语言)函数可以作为参数传递,等等......

    【讨论】:

      【解决方案3】:

      函数是 javascript 中的对象,因此可以将它们分配给变量并像任何其他值一样传递。最终他们可以被处决。

      这里发生的是myFunction返回一个函数,然后当然可以执行该函数。

      让我简化你的例子:

      // function that returns a function.
      var foo = function() {
      
        // declare a function, but don't run it right now.
        var fn = function() {
          return "bar";
        };
      
        // return the function object.
        return fn;
      }
      
      var someFn = foo(); // function object is returned from foo()
      someFn();           // "bar" is returned
      
      // Which means you could also do this!
      // the first () executes foo, second () executes the function returned by foo()
      foo()()             // "bar" is returned
      

      在本例中,foo() 返回一个函数。该函数保存到局部变量someFn中,然后执行。

      返回函数的函数有时让你难以理解,但它是 javascript 最强大的功能之一,因为它允许你做一些非常棘手的事情。

      【讨论】:

      • 我有点明白,但也有点输了,哈哈。 1.当你说“//第一个()执行foo,第二个()执行foo()返回的函数”时,你的意思是说第2个()执行了someFn这种情况吗? 2. 在这种情况下,'return fn' 和 'fun()' 的效果是一样的,不是吗?因为 fn() 本身返回一个值给 foo() 然后 foo 把 fn() 的值作为它自己的值返回给 main?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 2017-12-16
      • 2018-11-28
      • 2014-04-26
      相关资源
      最近更新 更多