javascript - 调用 Javascript 函数的困惑

标签 javascript

有人可以解释为什么“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 分配给变量的麻烦,这反过来又将两个语句减少到这一行。

最后,函数定义的结尾分号可能看起来很奇怪,但它们在语法上是正确的。每个匿名函数都被分配给一个变量,因此这些分号中的每一个实际上都终止了一个赋值语句。

现场演示:http://jsfiddle.net/kLghedp3/8/

关于javascript - 调用 Javascript 函数的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27728811/

相关文章:

javascript - 如何调试用 es6/es7 编写的 node.js 后端?

javascript - 使用 JavaScript 进行网页抓取? JavaScript 文件 I/O? JavaScript 迭代 URL?自动加载外部脚本?

javascript - 如何使用 Jquery 向下滑动添加到 DOM 之前隐藏的元素?

javascript - 图像动画下来 javascript(无 jQuery)

javascript - 稍微旋转文本——我应该使用 css 还是 javascript?

javascript - 我不明白在我的代码中使用 push 与使用 unshift 之间的区别

Javascript:在多个元素(ID 和类)上设置 Z-Index

javascript - 嵌入音频

javascript - Vuejs渲染错误: "TypeError: Cannot read property ' props' of undefined"Vuejs

javascript - 如何显示每个数组的动态文本?