var y = new w();
var x = y.z;
y.z= function() {
doOneThing();
x();
}
其中w
不包含z
个对象但包含其他对象(例如a
,b
,c
)
x();
可能也指的是什么? (再次,这是JavaScript)
函数调用自身吗?
答案 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();
}
它归结为同样的事情,但会避免错误被抛出。