javascript 函数 中 函数-深入理解JavaScript中的函数

2023-08-23 0 9,968 百度已收录

JavaScript 在传递或访问函数参数方面非常灵活。 让我们看看操作函数参数的方式。

缺少参数

调用函数时,该函数可以具有比所需数量更少或更多的参数。 如果调用的函数的参数少于声明的参数,则缺少的参数将设置为未定义。

function callMe(a, b, c) {
   console.log("c is " + typeof c);
}
callMe("Code", "Morning"); 
// Output: "c is undefined"
callMe("Learn", "JavaScript", "Functions"); 
// Output: "c is string"

参数对象

所有 JavaScript 函数都有一个称为参数的特殊对象,它是函数调用期间传递的参数的链接列表。 该对象可用于访问各个参数或获取传递给函数的参数总数。

function callMe() {
   var i;
   for (i = 0; i < arguments.length; i++) {
      console.log(arguments[i]);
   }
   console.log("Total arguments passed: " + arguments.length);
}

该函数假设没有传递任何参数,但正如我所说,您可以将任意数量的参数传递给 JavaScript 函数。 我可以这样调用这个函数:

callMe("Code", "Morning", "Mr. Programmer");
// Output":
// Code
// Morning
// Mr. Programmer
// Total arguments passed: 3

javascript 函数 中 函数-深入理解JavaScript中的函数

每个参数都可以作为链接列表项从参数对象访问。 传递给函数的参数总数可从arguments.length 属性获得。

默认参数

您是 C++ 或 C# 程序员吗? 你见过有默认参数的函数吗? 事实上,你会回答是的! ECMAScript6 带来了 JavaScript 的这一功能,您可以使用默认参数定义函数。

function greetMyVisitors(name, profession = "The cool programmer") {
    alert("Welcome Mr. " + name + ", " + profession);
}

此功能有礼貌地向博客访问者打招呼。 它采用两个参数 name 和 professional 并在消息框中显示欢迎消息。 如果在调用期间没有传递任何参数(或“未定义”),则第二个参数采用默认值。

greetMyVisitors("Justin Bieber", "The singer"); 
// Shows the message "Welcome Mr. Justin Bieber, The singer"
greetMyVisitors("Bob Martin"); 
// Shows the message "Welcome Mr. Bob Martin, The cool programmer"
greetMyVisitors("John Papa", undefined); 
// Shows the message "Welcome Mr. John Papa, The cool programmer"

嵌套函数

javascript 函数 中 函数-深入理解JavaScript中的函数

一个函数内部可以包含一个或多个函数。 内部函数内部可能再次包含函数。 让我们看看下面的实际操作。

function wakeUpAndCode() {
   function wakeUp() {
      console.log("I just woke up");
   }
   function code() {
      console.log("I am ready to code now");
   }
   wakeUp();
   code();
}
wakeUpAndCode();
// Output:
// I just woke up
// I am ready to code now

函数wakeUpAndCode包含两个内部函数wakeUp和code。 当wakeUpAndCode被调用时,函数体开始执行函数体。 外部函数中只有两个可执行语句,调用wakeUp的方式和代码。 调用wakeUp将执行内部wakeUp函数javascript 函数 中 函数,该函数会将字符串“Ijustwokeup”写入控制台。 调用代码会将“Iamreadytocodenow”字符串写入控制台。

内部函数可以访问外部函数的所有变量和参数。 内部函数是函数内部的某种私有实现,但不能从外部函数外部调用它。 使用内部函数生成 JavaScript,我将在另一篇文章中讨论这一点。

立即调用函数表达式(IIFE,发音为 iffy)

IIFE 是立即调用的匿名函数表达式。 IIFE 看起来像这样:

(function() {
   // Your awesome code here
}());

您所要做的就是创建一个匿名函数,在函数定义后面紧跟一对括号来调用该函数,最后将所有代码包装在另一对括号中。 最里面的括号将其上面的所有内容都转换为表达式,因为括号不能包含 JavaScript 句子。 函数定义前面的括号立即调用该函数。

IIFE 块内定义的任何变量或函数都是该块的本地变量,并且不能被此范围之外的任何代码更改。

看看 IIFE 的这个例子就知道了。 该函数也是手动执行而不被调用。

(function() {
   console.log("I run on my own.");
}());

只需将代码复制并粘贴到 plunker 中,瞧,就可以控制 Chiayi 在浏览器中的输出。 如果您不知道在哪里查找浏览器控制台,只需在浏览器窗口中按 F12 即可调出开发人员工具。 跳转到console选项卡可以查看console.log语句的所有输出。

IIFE 是在代码中创建本地作用域的好方法。 它们帮助您保护变量和函数不被应用程序的其他部分修改或覆盖。 JavaScript 中 IIFE 的其他优点? 他们如何解决全球范围的污染问题? 欢迎阅读我关于立即执行函数表达式的文章。

构造函数

函数可以充当构造函数,但构造函数可以用来创建新对象。 这是 JavaScript 面向对象的特性之一。 使用构造函数的好处在于,您还可以使用预定义的属性和方法创建尽可能多的对象。 如果您将其与其他语言中的类和对象联系起来,那么您就做对了。

让我们创建一个具有一些属性和技巧的构造函数程序员。 您可以假设这是一门您最喜欢的语言的课程。

function Programmer(name, company, expertise) {
   this.name = name;
   this.company = company;
   this.expertise = expertise;
   this.writeCode = function() {
      console.log("Writing some public static thing..");
   }
   this.makeSkypeCall = function() {
      console.log("Making skype call..");
   }
   this.doSalsa = function() {
      console.log("I'm a programmer, I can only do Gangnam style..");
   }
   this.canWriteJavaScript = function() {
      return expertise === "JavaScript";
   }
}

该函数采用三个参数并创建一个具有三个属性和四个方法的对象。 我认为里面的代码不需要任何解释。 据我所知,我可以创建任意数量的程序员对象。

var javaProgrammer = new Programmer("Mohit Srivastava", "Infosys", "Java");
var dotnetProgrammer = new Programmer("Atul Mishra", "Prowareness", ".NET");

事实上,也可以使用对象字面量语句类型来创建具有相同属性和技能的对象,但是我们需要多次编译相同的代码,这并不是一个很好的做法。 如果你知道编程的 DRY 原则,那么你就不会不同意我的观点。 构造函数可以一次定义对象并在需要时创建实际实例。

警告!

new 关键字仍然用于从构造函数创建新对象。 忘记 new 并创建一个像这样的实例 ->

var jsProgrammer = Programmer("Douglas Crockford", "Yahoo", "JavaScript")

最终会将所有属性和技巧添加到全局窗口对象中,哇,这将是可怕的。 原因是,除非明确指定,否则“this”指向全局窗口对象。 使用 new 将“this”上下文设置为当前正在创建的对象。

然而,有一个解决方法可以解决这个问题。 您可以将构造函数的实现更改为字段安全,然后在创建新对象时愉快地忽略 new 关键字。 请参阅下面更改后的构造函数代码。 为了方便观看,我删除了一些技巧。

function Programmer(name, company, expertise) {
   if(!(this instanceof Programmer)) {
      return new Programmer(name, company, expertise);
   }
   this.name = name;
   this.company = company;
   this.expertise = expertise;
   this.writeCode = function() {
      console.log("Writing some public static thing..");
   }
}

if 条件检查 this 对象是否是 Programmer 的实例。 如果没有,它会创建一个新的 Programmer 对象javascript 函数 中 函数,并通过再次调用构造函数返回相同的内容。

注意:如果不使用“new”关键字,则无法在严格模式下从构造函数创建新对象。 严格模式强制执行一些编码准则,但如果您编写的内容不安全,则会引发错误。 要启用严格模式,您只需在代码开头添加字符串“usestrict”即可。 在严格模式下运行代码是一个很好的做法。

'use strict'
 function doSomething() { ... }
 ....
 ....

我在本文中几乎涵盖了有关函数的所有内容。 函数在 JavaScript 中被视为一等公民。 如果你想掌握 JavaScript,理解函数可能是最重要的事情。

我欢迎你的原谅。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript 函数 中 函数-深入理解JavaScript中的函数 https://www.wkzy.net/game/147507.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务