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对不起,不确定您的意思是什么