Javascript Closure Conditional-当函数未作为参数传递时,该返回函数如何获取作为参数设置的值?
因此,Javascript Closure Conditional-当函数未作为参数传递时,该返回函数如何获取作为参数设置的值?,javascript,closures,Javascript,Closures,因此,返回函数(n)仍然返回最初作为增广函数提供给其父函数的值。但是我不明白为什么,当我没有从var digit_name=(function(){传递n的值时,返回函数(n){从原始参数获取它的值 特别是我用var n=4; JS var digit_name = (function(){ var names; var n = 4; return function(n){ if(!names){
返回函数(n)
仍然返回最初作为增广函数提供给其父函数的值。但是我不明白为什么,当我没有从var digit_name=(function(){
传递n的值时,返回函数(n){
从原始参数获取它的值
特别是我用var n=4;
JS
var digit_name = (function(){
var names;
var n = 4;
return function(n){
if(!names){
names = ['zero','one','two','three'];
}
return names[n];
}
}());
console.info(digit_name(3)); //Three
另外,如果我用一个数字覆盖
返回函数(n)
,返回函数(1)我将语法错误:缺少形式参数
。我知道返回名称[n]不知道什么是n
,那么为什么不给出一个n是未定义的
错误?如果您查看控制台中数字名称的定义,您将看到它是此函数:
function (n){
if(!names){
names = ['zero','one','two','three'];
}
return names[n];
}
var digit_name = (function () {
var names;
var defaultn = 0;
return function (n) {
if (!n) n = defaultn;
if (!names) {
names = ['zero', 'one', 'two', 'three'];
}
return names[n];
}
}());
console.info(digit_name(3)); //Three
console.info(digit_name()); //zero
因此您没有覆盖n,因为此函数中n的作用域现在是参数n,而不是上面声明的变量。如果您查看控制台中digit_name的定义,您将看到它是此函数:
function (n){
if(!names){
names = ['zero','one','two','three'];
}
return names[n];
}
var digit_name = (function () {
var names;
var defaultn = 0;
return function (n) {
if (!n) n = defaultn;
if (!names) {
names = ['zero', 'one', 'two', 'three'];
}
return names[n];
}
}());
console.info(digit_name(3)); //Three
console.info(digit_name()); //zero
因此,您没有覆盖n,因为此函数中n的作用域现在是参数n,而不是上面声明的变量。在您的示例中,您的命名和作用域与变量
n
冲突。外部函数中定义的var n
的值为4。内部函数接受单个参数ter声明为n
。因此,内部函数中的n
变量指的是其内部作用域,而不再指外部函数中的var n
。如果需要默认值,可以将外部变量命名为不同的名称,并检查内部函数中是否存在值n
:
function (n){
if(!names){
names = ['zero','one','two','three'];
}
return names[n];
}
var digit_name = (function () {
var names;
var defaultn = 0;
return function (n) {
if (!n) n = defaultn;
if (!names) {
names = ['zero', 'one', 'two', 'three'];
}
return names[n];
}
}());
console.info(digit_name(3)); //Three
console.info(digit_name()); //zero
在您的示例中,您的命名和作用域与变量
n
发生冲突。外部函数中定义的var n
的值为4。内部函数接受声明为n
的单个参数。因此,内部函数中的n
变量指的是它的“内部作用域,不长”r指外部函数中的var n
。如果需要默认值,可以将外部变量命名为不同的名称,并检查内部函数中是否存在值n
:
function (n){
if(!names){
names = ['zero','one','two','three'];
}
return names[n];
}
var digit_name = (function () {
var names;
var defaultn = 0;
return function (n) {
if (!n) n = defaultn;
if (!names) {
names = ['zero', 'one', 'two', 'three'];
}
return names[n];
}
}());
console.info(digit_name(3)); //Three
console.info(digit_name()); //zero
我不完全确定你在问什么,所以我只想解释为什么你会得到你所做的输出 当代码运行时,执行IIFE(立即调用的函数表达式),并且
digit\u name
引用从它返回的函数。该函数仍然可以通过闭包访问外部n
和name
变量
然后调用digital\u name
并向其传递一个参数。digital\u name
的形式参数是n
,它隐藏了在外部作用域中声明的n
。不再有任何方法可以引用该外部n
。因此将使用传递到digital\u name
的任何值
实际上,这种情况下的IIFE是毫无意义的(除了它可以防止您每次调用函数时都必须创建数组这一事实之外),您的代码与此等效,除了数组差异:
var digit_name = function (n) {
return ['zero','one','two','three'][n];
};
console.info(digit_name(3)); // "three"
我不完全确定你在问什么,所以我只想解释为什么你会得到你所做的输出 当代码运行时,执行IIFE(立即调用的函数表达式),并且
digit\u name
引用从它返回的函数。该函数仍然可以通过闭包访问外部n
和name
变量
然后调用digital\u name
并向其传递一个参数。digital\u name
的形式参数是n
,它隐藏了在外部作用域中声明的n
。不再有任何方法可以引用该外部n
。因此将使用传递到digital\u name
的任何值
实际上,这种情况下的IIFE是毫无意义的(除了它可以防止您每次调用函数时都必须创建数组这一事实之外),您的代码与此等效,除了数组差异:
var digit_name = function (n) {
return ['zero','one','two','three'][n];
};
console.info(digit_name(3)); // "three"
您不能调用digital_name(3),因为digital_name没有收到参数,请注意您正在使用自调用函数(不知道为什么)。不,可以调用它。很明显,它返回“3”,不是吗?@RodrigoDias只要把这段代码粘贴到你的控制台上,你就会看到它确实收到了一个参数,因为它是内部函数@varnie。@Rodrigo这是为什么它工作正常的神奇之处?这就是问题的全部基础,返回函数如何获得
数字\u name(3)上的值集
?自调用的原因是它在页面加载时运行:)在一些测试确实有效,但实际上过于复杂后,您不能调用digital_name(3),因为digital_name没有收到参数,还请注意,您正在使用自调用函数(不知道为什么)。不,可以调用它。很明显,它返回“三”,不是吗?@RodrigoDias只要把这段代码粘贴到你的控制台上,你就会看到它确实收到了一个参数,因为它是内部函数@varnie。@Rodrigo这是为什么它工作正常的神奇之处?这就是问题的全部基础,返回函数如何获得数字\u name(3)上的值集
?自调用的原因是,它在页面加载时运行:)在一些测试确实有效,但确实过于复杂后,是的,这就是闭包的工作原理。那么它是如何得到n的值的呢?当您调用digit_name(3)时,您将其作为参数传入因此,匿名函数不是您设置参数的地方,例如,这不是您设置参数的方式:var digit\u name=(函数(n){
@JamieHutber对不起,不确定您的意思是什么