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
每个参数都可以作为链接列表项从参数对象访问。 传递给函数的参数总数可从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"
嵌套函数
一个函数内部可以包含一个或多个函数。 内部函数内部可能再次包含函数。 让我们看看下面的实际操作。
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,理解函数可能是最重要的事情。
我欢迎你的原谅。