调用Javascript函数的混乱
有人能解释一下为什么“myPet=pet(Vivie);”实际上不调用pet函数,而myPet()调用吗?它不同于我学习的编程语言,比如Java。谢谢调用Javascript函数的混乱,javascript,Javascript,有人能解释一下为什么“myPet=pet(Vivie);”实际上不调用pet函数,而myPet()调用吗?它不同于我学习的编程语言,比如Java。谢谢 var pet = function(name) { var getName = function() { return console.log(name); } return getName; }, myPet =
var pet = function(name) {
var getName = function() {
return console.log(name);
}
return getName;
},
myPet = pet("Vivie"); // ????????
myPet(); // Returns "Vivie"
pet()
返回函数并将其分配给myPet
。如果要调用pet()
返回的函数,也可以执行:pet('Vivie')()
pet()返回函数并将其分配给变量myPet
。因此Mypet()
实际上调用了该函数。如果要调用pet()返回的函数,还可以执行以下操作:pet(“某个名称”)()代码>
为了更好地理解,您可以尝试编辑以下示例:
如果您注释掉myPet=pet(“Tushar”)代码>该代码不会运行,因为mypet()未被分配任何内容。试试看
var pet=函数(名称){
警报(名称);
},
myPet=宠物(“Tushar”);
myPet()代码>如果您将在控制台中逐个执行代码,您可能会得到答案
myPet = pet("Vivie");
上面这一行为myPet分配了一个函数,该函数类似于下面的主体
function () {
return console.log(name);
}
var pet = function(name) {
var getName = function() {
return console.log(name);
}
return getName();
}
在这里,name的值来自pet函数的闭包
当您调用myPet
时,它调用的是名为Vivie的函数
因此,如果您担心函数pet
没有调用该方法,那是因为在pet
函数中没有调用该函数。它只是返回函数定义本身
如果希望pet
函数打印retsult,请像下面那样定义它
function () {
return console.log(name);
}
var pet = function(name) {
var getName = function() {
return console.log(name);
}
return getName();
}
通过这一行myPet=pet(“Vivie”)代码>
您正在为var myPet分配一个函数和一个参数。因此,myPet将成为另一个功能
var getName = function() {
console.log(name);
}
因此,您必须调用myPet();作为获取返回的函数 这是js函数和变量函数之间的区别,下面是对这些函数的非常好的解释
您可以通过修改代码直接调用此函数,如下所示:
var pet = function(name) {
return console.log(name);
};
pet("test1");
调用pet
时所做的是返回一个函数,并在函数作用域变量name
上设置字符串“Vivie”。因此,您的myPet
变量接收getName
值,这是一个打印函数作用域名称变量值的函数。
在调用myPet
时,您已经在调用pet
返回的函数,即getName
打印带有预设值“Vivie”的name变量
希望这有助于澄清 javascript中的函数被视为数据。因此,您可以使用函数作为变量
在下面的行中
myPet = pet("Vivie");
实际上,您所做的是调用pet函数,包装返回的函数并将其放入myPet中
但当你编写代码时
myPet();
var pet = function(name) {
return console.log(name);
},
myPet = pet("Vivie");
您正在调用myPet()函数[从pet返回的函数]。这正是你把宠物分配进去后得到的我的宠物
这就是编写myPet()代码的原因它正在调用函数
现在有一件有趣的事
当您编写此代码时
myPet();
var pet = function(name) {
return console.log(name);
},
myPet = pet("Vivie");
有效!!!!那么它为什么会起作用呢?
在这里,当您调用pet函数时,它会控制台您的名字并返回控制台。它没有返回任何函数
但是在myPet的代码中,您得到了一个函数
让我们测试一下我们所了解的pet返回对象的类型
在您的情况下:
您正在调用pet,但在返回的函数中没有执行任何操作。相反,您是说您可以使用myPet执行这个返回的函数
另一种情况:
首先,您执行pet并返回控制台,这就是为什么当您请求typeof myPet时,您没有得到任何定义的类型
最后,如果您想立即调用返回的函数,那么您应该以这种方式使用自调用函数
myPet = pet("Vivie")();
故事的寓意:
这里我的宠物指的是宠物。及
这里myPet调用pet
参考资料:你为什么认为myPet=pet(“Vivie”)
不调用pet
函数pet
显然被调用并返回一个新函数,该函数被分配给myPet
现在回到你的代码
myPet = pet("Vivie"); // ????????
嗯,它不会打印任何东西。它只是返回另一个函数。这被称为“咖喱”。你可以学习更多关于咖喱的知识
它返回“Vivie”的原因是pet形成了一个闭包,并且返回的getName
函数在它的作用域内。因此,getName
可以查看并捕获pet
的参数(在本例中为“Vivie”)的值并保留它。myPet()
实际上是调用getName
的定义。您可以了解更多关于闭包的信息如果您来自一种不支持一流函数的语言,那么当您遇到一种支持一流函数的语言时,可能会感到困惑。第一类函数是可以传递给函数或从函数返回的函数,就像它是字符串或数字等普通数据一样。下面的代码应该会有所启发:
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
存在于嵌套函数的直接外部环境中,因此即使在外部函数(包含在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());
在最后一句话中,我的宠物(
var pet = function(name) {
var getName = function() {
return console.log(name);
}
return getName;
},
myPet = pet("Vivie");
console.log(typeof myPet());