js函数详解(1)

js函数是被设计为执行特定任务的代码块,js函数会在某代码调用它时被执行
例如:

function fn(a, b) {
      return a * b
 }
console.log(fn(2, 5))

js函数语法

  • 通过 function关键词进行定义,随后跟函数名括号()
    函数名可以包含字母,数字,下划线和美元符号(和变量命名规则相同)
    括号内可包含由逗号分隔的参数(a, b, c, d…)
    在函数中参数时局部变量
    由函数执行的代码被放置在{要执行的代码}中
  • 函数是一组可以随时随地运行的语句,是ECMAscript的核心。函数可以通过其名字加上括号中的参数进行调用,如果有多个参数,如果你想调用上列中的那个函数,可以使用如下代码
    fn(2, 3)
  • 函数fn()返回值,不必专门声明,即使函数确实有值,也不必明确的去声明它,该函数只需要使用return运算符后跟要返回的值即可
  • 函数在执行过return语句后立即停止代码,因此return语句后的代码都不会被执行,如果函数没有返回值,那么可以调用没有函数的return运算符,随时退出函数,如果函数无明确的返回值,或调用了没有参数的return语句,那么它真正的返回值是undefined
    函数调用
    函数中的代码将在其他代码调用该函数时执行
  • 当事件发生时(用户点击按钮时)
  • 当js代码调用时
  • 自调用

为什么使用函数

你能够对代码进行复用,只要定义一次代码,就可以多次使用,
能够多次想同一个函数传递不同参数,以产生不同的结果

arguments对象
在函数中,使用特殊对象arguments,开发者无需明确指出参数名,就能访问他们
例如:
在函数fn()中,第一个参数是a, 用arguments[0]也可以访问这个值,即第一个参数的值(第一个参数位于位置0,第二个参数位于位置1,以此类推)

function fn() {
	 if(arguments[0] == 2) {
	 return
	 }
	 alert(arguments[0])
 }
console.log(fn(2, 5))

检测参数个数,引用属性arguments.length即可,与其他程序设计语言不同的,ECMAScript不会验证传递给函数的参数个数是否等于函数定义的参数个数,最多可接受25个,而不会引发任何错误,任何应该传递的参数而没有传递都会以undefined传递给函数,多余函数将忽略

模拟函数重载
用arguments对象判断传递给函数的参数个数,即可模拟函数重载

function fn() {
      if (arguments.length == 1) {
           console.log(arguments[0] + 10)
       } else if (arguments.length == 3){
                console.log(arguments[0] + arguments[1] + arguments[2])
      }
  }
 fn(2, 5, 1)

当只有一个参数时,fn()函数给参数加10,如果有三个参数,就会把三个参数相加,返回他们的和,所以fn(2) 输出12, fn(2, 5, 1)输出8

Function对象(类)

ECMAScript最令人感兴趣的可能莫过于函数实际上是功能完整的对象,
function 类可以表示开发者定义的任何函数
用function类直接创建函数的语法如下:
var function_name = new function(arg1, arg2, …, argn, function_body)
在上面的形式中,每个arg都是一个参数,最后一个参数是函数主体(要执行的代码),这些参数必须是字符串
例如:

function sayHi(sName, sMessage) {
alert("Hello " + sName + sMessage);
}
还可以这样定义它
var sayHi = new Function(“sName”, “sMessage”, "alert(“Hello " + sName + sMessage);”);
sayHi(1, 2);
虽然由于字符串的关系,这种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,他们的行为与用function类明确创建的函数行为是相同的

var doAdd = new Function(“iNum”, “alert(iNum + 20)”);
var doAdd = new Function(“iNum”, “alert(iNum + 10)”);
doAdd(10);
输出20.第二个函数重载了第一个函数,

var doAdd = new Function(“iNum”, “alert(iNum + 10)”);
var alsodoAdd = doAdd;
doAdd(10); //输出 “20”
alsodoAdd(10); //输出 "20
很显然,doAdd的值被改成了指向不同对象的指针alsodoAdd,函数名只是指向函数对象的引用值,所以可以使两个变量指向同一个函数,在这里,变量doAdd被定义为函数,然后alsodoAdd被声明为指向同一个函数的指针,用两个变量都可以执行该函数,并输出相同结果,因此如果函数名只是指向函数的变量,那么可以把函数作为参数传递给另一个函数吗

function callAnotherFunc(fnFunction, vArgument) {
fnFunction(vArgument);
}

var doAdd = new Function(“iNum”, “alert(iNum + 10)”);

callAnotherFunc(doAdd, 10); //输出 “20”
在上面的例子中,callAnotherFunc()有两个参数,要调用的函数和传递给该函数的参数,这段代码把doAdd()传递给callAnotherFunc()函数,参数是10
⚠️ 尽管可以使用function构造函数创建函数,但最好不要使用它,因为用它定义函数远比传统方式要慢的多,不过,所有函数都应该看作function类的实例

function对象的length属性
函数属于引用类型,所以他们也有属性和方法
无论定义了几个参数,ECMAScript可以接受任意多个参数(最多25个 ),属性 length只是为查看默认情况下预期的参数个数提供了一种简便方式

function对象的方法
function对象也有与所有对象共享的valueOf()方法和toString()方法,这两个方法返回的都是函数的源代码,在调试时有用
function doAdd(iNum) {
alert(iNum + 10);
}

document.write(doAdd.toString(1));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web夏目贵志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值