gpt4 book ai didi

javascript - John Resig 的在线 JS 教程 #13 和 #14

转载 作者:行者123 更新时间:2023-12-02 17:58:27 25 4
gpt4 key购买 nike

http://ejohn.org/apps/learn/#13 http://ejohn.org/apps/learn/#14

关于 #13,以我的 Java 背景,我不太明白发生了什么,以及为什么 #14 是解决问题的解决方案。

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?" );
}

VS

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." );

有人可以更好地解释这段代码吗?我有 Java/Scala 背景,这对我来说真的很奇怪。我想我还不明白变量和对象在JS中是如何存储的。

我不明白为什么我们首先不能调用 samurai.yell(4);

最佳答案

您发布的代码的问题是“yell”函数要求外部作用域变量“ninja”保留对该对象的引用。如果它被更改(如您的示例中所示;它被设置为 null),则该函数将不起作用。

在您未发布的示例中,它已修复:

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

该函数通过 function 关键字后面的名称(“yell”)进行实例化。该名称将在函数内部用作对其自身的引用,因此不再依赖于变量“ninja”。

关于javascript - John Resig 的在线 JS 教程 #13 和 #14,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20787709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com