所以,这段代码片段非常方便,但我对它的工作方式有点惊讶。
var makeTree = function(h,s)
{
var height = h;
var season = s;
tree = {};
tree.getHeight = function()
{
return height;
}
tree.getSeason = function()
{
return season;
}
return tree;
}
正如你所看到的,我正在尝试创建一个类树来创建树对象,但是为了使所有属性都安全,我有一个makeTree函数将树对象返回给我,我只能访问它的属性通过getHeight和getSeason。
重要的是要注意树对象根本不包含字段高度和季节。
所以,说我这样做:
var banyan = makeTree(100,"summer");
var apple = makeTree(50,"winter");
我可以像这样访问两个对象的字段:
banyan.getSeason();
//"summer"
apple.getHeight();
//50
我的问题是这个世界是如何发生的?
所以,我想到了这一点,并猜测也许这就是它的工作方式:当我调用makeTree来制作banyan时,我用参数100调用它,并且makeTree函数返回给我一个具有常量函数getHeight的对象一直打电话给我100。 (没有任何记忆)
但后来我这样做了:
var makeTree = function(h,s)
{
var height = h;
var season = s;
tree = {};
tree.getHeight = function()
{
return height;
}
tree.getSeason = function()
{
return season;
}
tree.changeHeight = function(new_h) //added this
{
height = new_h;
}
return tree;
}
瞧!
banyan.changeHeight(60);
banyan.getHeight();
//60!!!!
好的,我的问题非常清楚,因为每个对象根本没有任何字段用于存储值,每个对象的高度和季节都存储在哪里?
之前我已经完成了Python,Java和C,所以如果有人可以在解释时进行比较和对比,那就太棒了!
答案 0 :(得分:-1)
运行时:
var makeTree = function(h,s)
{
// ...
}
您创建一个闭包 - 函数体内的所有内容,包括变量定义和函数都被捕获,以后可以访问。在您的情况下,您可以通过getHeight
,getSeason
函数等访问该闭包的内容。