2017-10-13 199 views
0

我最近学习JavaScript并碰到这段代码。调用Javascript函数返回一个未定义值的函数

function sayIntro(name,age){ 

var address = "TX"; 

return function(name,age,address){ 
console.log("I am "+ name + " \nI am "+ age + " \nfrom "+address); 
}; 

} 

sayIntro("john",27)(); 

按我的理解,结果是不确定的,因为恢复功能前面的两个变量的范围内 不可用。仍然如何获得输出如下?

I am john 
I am 27 
from TX 
+0

你只需阴影变量名。将它们重命名为内部函数中的其他内容,并且它工作正常。 – deceze

+0

'sayIntro'的变量仍然在匿名函数的范围内 - 这不是问题。问题是有一组全新的参数具有相同的名称,这些名称不是传递值,并且因为它们具有相同的名称,所以它们隐藏了其他变量。 'return function(){'解决。 – Ryan

+0

谢谢,但为什么这个问题得到减号?问是不是很愚蠢? –

回答

0

内部函数的参数会影响外部函数参数和变量。你可以直接访问内部函数中的变量,因为当它试图找到一个变量时,它从它的作用域开始,如果没有找到,则进入外部作用域,在这种情况下是外部函数的作用域并找到它们。

但是,如果您在内部函数中声明参数,则会创建它们,并且因为您没有为它们传递值,所以它们的值是undefined。所以你得到undefined

或者从内部功能

return function() { 
    console.log("I am "+ name + " \nI am "+ age + " \nfrom "+address); 
}; 

删除或只是删除address并调用内部函数,并传递给它的参数。

return function(name, age) { 
    console.log("I am "+ name + " \nI am "+ age + " \nfrom "+address); 
}; 

... 

sayIntro()("john",27); 

function sayIntro(name,age){ 
 

 
    var address = "TX"; 
 

 
    return function(){ 
 
     console.log("I am "+ name + " \nI am "+ age + " \nfrom "+address); 
 
    }; 
 

 
} 
 

 
sayIntro("john",27)();

+0

感谢您的详细解释,我明白发生了什么,因此根据您提到的第二种方式,当调用第一对括号时,不向外部函数传递参数,第二对括号将名称和年龄传递给内部函数对? –

+0

第一次调用返回内部和第二次调用传递参数 –

+0

ok和内部函数充当闭包? –