什么是x();参考?

时间:2008-12-31 22:25:39

标签: javascript

var y = new w();
var x = y.z;

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

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

x();可能也指的是什么? (再次,这是JavaScript)
函数调用自身吗?

5 个答案:

答案 0 :(得分:2)

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.

答案 1 :(得分:1)

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

可能会更加清晰

答案 2 :(得分:1)

x是一个变量,因为它的范围在已分配给y.z的函数之外,可以在y.z中访问

该代码中发生的是y被初始化为类型为'w'的新类,然后x被设置为对当前'z'函数的引用,该函数是实例'y的成员'班'w'。然后,函数'z'被一个调用doOneThing的新函数替换,然后执行'x'的值,因为已经建立的是'y.z'的先前值,因此, new yz通过在返回之前简单地调用旧的yz来扩展 yz的行为。

我希望这是有道理的。

当然,假设您确实说'y'对象没有'z'成员,则x将是未定义的,并且当您尝试执行x()时将抛出运行时错误。< / p>

答案 3 :(得分:1)

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

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

虽然这个比喻并不完美(字符串和函数之间实际上存在很多差异),但最初可能有助于理解这个函数变量二元性。

答案 4 :(得分:0)

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

var y = new w();
var x = y.z;

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

它归结为同样的事情,但会避免错误被抛出。