有人可以解释为什么“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"
最佳答案
如果您使用的语言不支持一等函数,那么当您遇到支持的语言时可能会感到困惑。 第一类函数 是可以传递给函数或从函数返回的函数,就好像它是普通数据(如字符串或数字)一样。下面的代码应该能说明一些问题:
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
“Vivie”被传递给 pet 持有的函数,然而 console.log()
打印它!这是通过称为闭包 的功能实现的。由于 name
存在于嵌套函数的直接外部环境中,变量绑定(bind)到它并继续存在,即使 外部函数(包含在 pet 中)执行。
关于console.log()
,请注意将其写为返回语句的一部分是不正确的,因为日志记录方法从不返回值;它只是打印到控制台。所以用下面的代码:
var pet = function(name) {
var getName = function() {
return console.log(name);
}
return getName;
},
myPet = pet("Vivie");
console.log(typeof myPet());
在最后一条语句中,myPet() 执行导致“Vivie”打印到控制台,但它返回无。因此,typeof 返回“undefined”,结果也打印到控制台。参见 http://jsfiddle.net/yu75k5tz/ .
回到传递函数的主题,再次考虑前面的代码片段。通过使用函数调用链,还有另一种更经济的方法来实现相同的结果,如下所示:
pet("Vivie")();
第一组括号调用 pet 返回一个函数,尽管是匿名的。第二对括号导致执行返回的函数。此代码消除了将 getName 分配给变量的麻烦,这反过来又将两个语句减少到这一行。
最后,函数定义的结尾分号可能看起来很奇怪,但它们在语法上是正确的。每个匿名函数都被分配给一个变量,因此这些分号中的每一个实际上都终止了一个赋值语句。
关于javascript - 调用 Javascript 函数的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27728811/