有人可以解释为什么“myPet = pet(Vivie);”实际上并没有调用pet函数,但myPet()呢?它与我学习的Java编程语言不同。感谢。
var pet = function(name) {
var getName = function() {
return console.log(name);
}
return getName;
},
myPet = pet("Vivie"); // ????????
myPet(); // Returns "Vivie"
答案 0 :(得分:1)
在 javascript 中,函数被视为DATA。因此,您可以将函数用作变量。
在以下行中,
myPet = pet("Vivie");
你实际做的是调用 pet 函数,包装返回的函数并将其放在 myPet 中。
但是当你编码时,
myPet();
您正在调用myPet()函数[从 pet 返回的函数]。这就是你将宠物分配到它之后得到的确切的myPet。
这就是您编码 myPet(); 时调用该函数的原因。
现在这是一个有趣的事情,
编码时,
var pet = function(name) {
return console.log(name);
},
myPet = pet("Vivie");
它有效!!!!为什么它的工作呢?
当您调用 pet 函数时,它会调用您的名称并返回控制台。它没有返回任何功能。
但是在你的myPet代码中你得到了一个函数。
让我们理解我们理解从 pet 中看到返回对象的类型,
在您的情况下:
var pet = function(name) {
var getName = function() {
return console.log(name);
}
return getName;
}
var myPet = pet("Vivie");
console.log(typeof myPet); // consoles : function.
您正在调用 pet ,但您没有在返回的函数内执行任何操作。而是说你可以使用 myPet 来执行这个返回的函数。
另一个案例:
var pet = function(name) {
return console.log(name);
}
var myPet = pet("Vivie"); // consoles : Vivie
console.log(typeof myPet); // consoles : undefined
首先,您正在执行pet并返回控制台,这就是为什么当您要求myPet类型时,您没有得到任何已定义的类型。
最后,如果你想立即调用返回的函数,那么你应该采用这种自调用函数。
myPet = pet("Vivie")();
故事的道德:
myPet = pet("Vivie");
此处 myPet 指的是 pet 。和
myPet();
此处 myPet 调用 pet 。
参考文献: typeof
答案 1 :(得分:1)
如果您使用的语言不支持第一类功能,那么当您遇到支持第一类功能的语言时,它会让您感到困惑。 第一类函数是可以传递给函数或从函数返回的函数,就像它是普通数据一样,如字符串或数字。以下代码应该有所启发:
var pet = function(name) { // assign anonymous func to pet
var getName = function() { // assign nested anonymous func to getName
console.log(name); // prints to console; no return value
};
return getName; // return getName value: func definition
};
myPet = pet("Vivie"); // assign getName value to myPet
myPet(); // appending () invokes defined func
"薇薇"传递给宠物持有的函数,但console.log()
打印它!这是通过称为闭包的功能实现的。由于name
存在于嵌套函数的直接外部环境中,因此变量绑定到它并且在外部函数(包含在pet中)执行后,甚至继续存在。
关于console.log()
,请注意将它作为return语句的一部分写入是不正确的,因为logging方法永远不会返回值;它只是打印到控制台。所以使用以下代码:
var pet = function(name) {
var getName = function() {
return console.log(name);
}
return getName;
},
myPet = pet("Vivie");
console.log(typeof myPet());
在最后一个语句中,myPet()执行导致" Vivie"要打印到控制台但它返回 nothing 。因此,typeof返回" undefined"并且结果也被打印到控制台。请参阅http://jsfiddle.net/yu75k5tz/。
回到传递函数的主题,再考虑前面的代码片段。通过使用函数调用链,可以使用另一种更经济的方法来实现相同的结果,如下所示:
pet("Vivie")();
第一组括号调用pet返回一个函数,尽管是匿名的。第二对括号使得返回的函数执行。此代码消除了必须将getName分配给变量,这反过来将两个语句减少到这个单行。
最后,函数定义的尾部分号可能看起来很奇怪,但它们在语法上是正确的。每个匿名函数都被赋值给一个变量,因此每个分号实际上都会终止一个赋值语句。
答案 2 :(得分:0)
pet()
返回该函数并将其分配给myPet
。如果您想调用pet()
返回的函数,您也可以执行:pet('Vivie')();
答案 3 :(得分:0)
pet()
返回该函数并将其分配给变量myPet
。所以Mypet()
实际上调用了该函数。如果你想调用pet()返回的函数,你也可以这样做:pet("some name")();
您可以尝试编辑以下示例以便更好地理解:
如果您注释掉myPet = pet("Tushar");
,代码将无法运行,因为mypet()尚未分配任何内容。试试吧。
var pet = function(name) {
alert(name);
},
myPet = pet("Tushar");
myPet();
答案 4 :(得分:0)
如果您将逐一在控制台中执行代码,您可能会得到答案。
myPet = pet("Vivie");
以上一行是为myPet分配一个函数,如下图
function () {
return console.log(name);
}
这里名字的价值来自宠物功能的关闭。
当您致电myPet
时,它会使用name as Vivie
调用该功能。
因此,如果您担心函数pet
没有调用该方法,那是因为在pet
函数中没有调用函数的地方。它只是返回函数定义本身。
如果您希望pet
函数打印retsult,请将其定义为bellow
var pet = function(name) {
var getName = function() {
return console.log(name);
}
return getName();
}
答案 5 :(得分:0)
通过这一行myPet = pet("Vivie");
您正在为var myPet分配一个函数和一个参数。所以myPet将成为另一个功能
var getName = function() {
console.log(name);
}
因此你必须调用myPet();作为获得回报的功能。
答案 6 :(得分:0)
这是js函数和变量函数之间的区别,以下是对这些
的非常好的解释JS Functions Vs Variable Functions
您可以通过修改代码直接调用此函数,如:
var pet = function(name) {
return console.log(name);
};
pet("test1");
答案 7 :(得分:0)
当您调用pet
时,您所做的是返回一个函数,并在函数范围的变量name
上设置字符串“Vivie”。因此,您的myPet
变量接收getName
值,该函数打印函数范围名称变量的值。
当您调用myPet
时,您已经调用pet
返回的函数,getName
打印名称变量,其预设值为“Vivie”。
希望有助于清除它。 :)
答案 8 :(得分:0)
为什么您认为myPet = pet("Vivie");
没有调用pet
函数?显然会调用pet
并返回一个分配给myPet
的新函数。
现在回到你的代码。
myPet = pet("Vivie"); // ????????
嗯,它不会打印任何东西。它只返回另一个函数。这称为 currying 。您可以详细了解cur here
myPet(); // Returns "Vivie"
返回“Vivie”的原因是因为pet形成了 闭包 ,并且返回的getName
函数在其范围内。因此getName
可以查看并捕获pet
的参数值(在本例中为“Vivie”)并保留它。 myPet()
的作用实际上是调用getName
的定义。您可以详细了解闭包here