【问题标题】:What does x(); refer to?x(); 是什么意思?参考?
【发布时间】:2009-01-01 08:11:59
【问题描述】:
var y = new w();
var x = y.z;

y.z= function() {
      doOneThing();
      x();
   }

其中w 不包含z 对象但包含其他对象(例如,abc

x(); 也可能指的是什么? (同样,这是 JavaScript)
函数是否在调用自身?

【问题讨论】:

    标签: javascript


    【解决方案1】:
    var y = new w();
    var x = y.z;  # x = undefined ( you say there is no w().z ) 
    
    y.z= function() {
            doOneThing();
          x();  # undefined, unless doOneThing defines x 
    };
    

    但是,如果您设法在 y.z() 之前的某个时间定义 x;那么 x() 将是当时定义的任何内容。

    根据您的陈述,以下代码执行类似的操作。

    var y = {}; 
    var x; 
    y.z = function(){ 
            x(); 
    }; 
    y.z(); # type error, x is not a function. 
    x = function(){ } ; 
    y.z(); # works.  
    x = undefined; 
    y.z(); # type error, x is not a function.
    

    【讨论】:

      【解决方案2】:
      var y = new w();
      
      // Create a global variable x referring to the y.z method
      var x = y.z;
      
      y.z= function() {
              doOneThing();
      
            // Refers to the global x
            x();
           }
      

      x 重命名为oldZ 可能会更清楚

      【讨论】:

      • 函数是否在调用自身?
      • 如果 "var x = y.z" after "y.z = function() ... " 那么它会调用自己
      • 但请注意,在规范中,y.z 在分配之前不存在。
      【解决方案3】:

      让您难以理解的是,在 JavaScript(以及许多其他动态解释语言中)中,函数也是“一等公民”。它们可以像任何其他变量一样被操纵。

      也许它可以帮助将 JavaScript 函数可视化为包含代码的字符串。当使用 () 语法调用时,JavaScript 执行字符串中的代码。但除此之外,它们可以像任何其他搅拌变量一样被操纵。

      虽然这个类比并不完美(字符串和函数之间实际上存在许多差异),但它可能有助于初步理解这种函数变量对偶性。

      【讨论】:

        【解决方案4】:

        x 是一个变量,因为它的作用域在分配给 y.z 的函数之外,所以可以在 y.z 内部访问

        该代码中发生的事情是 y 被初始化为类型为“w”的新类,然后 x 被设置为对当前“z”函数的引用,该函数是实例“y”的成员'类'w'。然后,函数 'z' 被一个新函数替换,该函数调用 doOneThing,然后执行 'x' 的值,正如已经确定的那样,它是 'y.z' 的先前值,因此,new y.z 扩展了 old y.z 的行为,方法是在旧 y.z 返回之前简单地调用它。

        我希望这是有道理的。

        当然,假设你确实说 'y' 对象没有 'z' 成员,那么 x 将是未定义的,并且当你尝试执行 x() 时会抛出运行时错误。

        【讨论】:

          【解决方案5】:

          看起来他们试图重载 w.z() 方法,但这很奇怪,因为你说 z() 方法不存在。鉴于这种可能性,我会这样编写代码:

          var y = new w();
          var x = y.z;
          
          y.z= function() {
                doOneThing();
                if (x) x();
             }
          

          归结为同样的事情,但会避免引发错误。

          【讨论】:

            猜你喜欢
            • 2015-03-24
            • 2020-03-18
            • 2021-08-02
            • 2019-06-27
            • 2020-10-02
            • 2011-05-27
            • 2018-05-03
            • 1970-01-01
            • 2022-01-22
            相关资源
            最近更新 更多