【发布时间】:2009-01-01 08:11:59
【问题描述】:
var y = new w();
var x = y.z;
y.z= function() {
doOneThing();
x();
}
其中w 不包含z 对象但包含其他对象(例如,a、b、c)
x(); 也可能指的是什么? (同样,这是 JavaScript)
函数是否在调用自身?
【问题讨论】:
标签: javascript
var y = new w();
var x = y.z;
y.z= function() {
doOneThing();
x();
}
其中w 不包含z 对象但包含其他对象(例如,a、b、c)
x(); 也可能指的是什么? (同样,这是 JavaScript)
函数是否在调用自身?
【问题讨论】:
标签: javascript
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.
【讨论】:
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 可能会更清楚
【讨论】:
让您难以理解的是,在 JavaScript(以及许多其他动态解释语言中)中,函数也是“一等公民”。它们可以像任何其他变量一样被操纵。
也许它可以帮助将 JavaScript 函数可视化为包含代码的字符串。当使用 () 语法调用时,JavaScript 执行字符串中的代码。但除此之外,它们可以像任何其他搅拌变量一样被操纵。
虽然这个类比并不完美(字符串和函数之间实际上存在许多差异),但它可能有助于初步理解这种函数变量对偶性。
【讨论】:
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() 时会抛出运行时错误。
【讨论】:
看起来他们试图重载 w.z() 方法,但这很奇怪,因为你说 z() 方法不存在。鉴于这种可能性,我会这样编写代码:
var y = new w();
var x = y.z;
y.z= function() {
doOneThing();
if (x) x();
}
归结为同样的事情,但会避免引发错误。
【讨论】: