2013-10-25 63 views
1

我们在挖掘JavaScript时遇到了麻烦,请帮助我们。在此先感谢在JavaScript中分配内存

下面的代码,为什么武士仍然不能调用函数嚷嚷

===> 
var ninja = { 
    yell: function yell(n){ 
    return n > 0 ? yell(n-1) + "a" : "hiy"; 
    } 
}; 
assert(ninja.yell(4) == "hiyaaaa", "Works as we would expect it to!"); 

var samurai = { yell: ninja.yell }; 
var ninja = {}; 
assert(samurai.yell(4) == "hiyaaaa", "The method correctly calls itself."); 

但是在这些代码就不能叫嚷嚷

===> 
var ninja = { 
    yell: function(n){ 
    return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; 
    } 
}; 
assert(ninja.yell(4) == "hiyaaaa", "A single object isn't too bad, either."); 

var samurai = { yell: ninja.yell }; 
var ninja = null; 

try { 
    samurai.yell(4); 
} catch(e){ 
    assert(false, "Uh, this isn't good! Where'd ninja.yell go?"); 
} 
+2

这与内存分配无关。 –

+0

可能重复的[对象null和行为在JavaScript](http://stackoverflow.com/questions/22216159/an-object-null-and-behaviour-in-javascript) –

回答

7

在第一个例子,yell是一个命名为函数。在该功能中,符号yell解析为该函数,因此它能够自行调用。因此,你已经消除了ninja对象并不重要。

var ninja = { 
    yell: function yell(n){ 
    //    ^^^^-------------------------- the name 
    return n > 0 ? yell(n-1) + "a" : "hiy"; 
    //    ^^^^------------------------ using the name 
    } 
}; 

在第二示例中,yell匿名功能和它试图通过ninja.yell调用本身,当ninja已被消灭,这显然会失败。

var ninja = { 
    yell: function(n){ 
    //   ^-------------------------------------- no name 
    return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; 
    //    ^^^^^^^^^^-------------------------- relies on `ninja` object 
    } 
}; 

附注:在你的第一个例子中,您可以通过分配不同,空对象给它(ninja = {})全歼ninja对象,但在第二个例子中,你通过分配null做到这一点(ninja = null )。没关系,使用空白对象或在两个示例中都会有相同的结果(尽管您在第二个示例中收到的错误会发生变化)。


附注2:请注意,第二var ninja = ...线在每个例子就像ninja = ...实际处理。构造var x = y;实际上是在不同时间发生的两个完全不相关的事情:变量声明var x,在进入包含它的执行上下文(松散地,“范围”)时发生;和赋值操作,x = y;,这是在逐行执行中到达该行代码时发生的。在一个范围内有多个声明是无操作的。更多:Poor misunderstood var

+0

非常感谢你! – nguyenngoc101