欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS学习(JS函数知识)

程序员文章站 2022-03-17 11:09:08
...

JS函数,函数定义,调用等

一,了解函数
函数对于任何语言来说都是一个核心的概念。通过函数可以封装多条语句,并且在任何时候调用执行。ECMAScript中函数使用function关键字来声明,后跟一组参数以及函数体。
函数的基本语法如下所示。

Function functionName(arg0,arg1,arg2....){
Statements
}
//函数示例
Function sayHi(name,message){
alert(”hello” + name +”,”+message);
}

这个函数可以通过其函数名来调用,后面还要加上一对圆括号和参数。调用sayHi()函数的代码;

sayHi(“tom”,”how are you,today”);
//函数输出结果为”hello tom,”how are you,today”.

函数定义中的命名参数name和message被用作字符串拼接的两个操作数,通过警告显示出来。
事实上,任何函数在任何时候都可以通过return语句后跟要返回的值来实现返回值。

function sum(num1,num2){
return num1 + num2;
}

这个sum()函数的作用是把两个值加起来。除了return语句之外没有任何声明表示该函数要返回一个值。调用这个韩式的示例代码如下:

var return = sum(5,10);

函数会在执行完return语句后立刻退出,因此位于return 之后的所有代码都不会执行。
例如:

Function sum(sum1 +sum2){
return sum1 +sum2;
alert (“hello world”);//永远不会执行
}

理解参数

ECMAScript函数的参数与大多数其他语言的参数不同。他不在乎函数传进来多少个参数,也不在乎参数的数据类型。实际上,在函数体内,可以通过arguments对象来访问这个参数数组,从而获取传递给函数的一个参数。
例如前面的sayHi;

Function sayHi(name,message){
alert(”hello” + name +”,”+message);
}

function sayHi(){
    alert(”hello“ + arguments[0] + "," +arguments [1];
    }
    //arguments 对象与数组类似,可以使用方括号语法来访问它的每一个元素

通过arguments对象的length属性可以获知有多少个参数传递给了函数。

function ags(){
alert(argumens.lengh);
}
args("string",45); //2
args();   //0

2,函数的创建方法
函数的三种创建方法:
2.1函数的第一种定义方式:函数声明

//这种定义方式下,函数不适于任何对象,但是在js中它始终是默认的全局对象。
//fun();函数可以先调用,是因为在js'的顶层,都用一个预编译处理机制。
function fun(){
console.log(3);
//return this;
//默认会有一个return this!不过也可以修改返回其他值。
//全局对象 window!
}
fun();//函数必须调用,不调用函数没有效果。

2.2 函数的第二种定义方式:函数表达式(存储在变量中)

var fun = function()
{
    donssole.log(3);
}
fun();//函数的调用必须写在函数声明的后面,即先声明再调用;

2.3 函数的第三种定义方式:构造函数

//函数可以自调
var fun = new Function(console.log(3));

三、函数的调用方式
函数的创建方式有3种,调用方式也不是单一的,调用方式有4种!
1、作为一个函数去调用 函数名+();(函数作为全局对象调用,会使this的值成为全局对象,使用window对象作为一个变量,容易造成程序崩溃!)
2、函数作为方法调用:(函数作为对象的方法调用,会使this的值成为对象的本身!)

var myobject = {
firstname = “tom”,
lastname = “tome”,
fullname:function()
{
    return this.firstname + ""+this.lastname;
}
}
myobject.fullname();   //返回“tom tome”;

3、使用构造函数调用函数:(构造函数中的this没有任何值)

function myfunction(arg1,arg2){
this.firstname = arg1;
this.lastname = arg2;
}
var x = new myfunction("tom ,tome");
x.firstname;
//构造函数调用会创建一个新的对象,新的对象会继承构造函数的属性和方法

4、作为函数方法调用函数:(这种可以设置this的值,我可以返回不同this!)
在js中函数是对象,是对象就有属性个方法,而call()和apply()是预定义的函数方法!
这两个方法都可以调用函数,两个方法的第一个参数必须是对象的本身!

function mtfunction(a,b){
return a*b;
}
myfunction.call(myobject,10,2);  //返回20

function myfunction(a,b){
return a*b;
}
myArray = [10,2];
myfunction.apply(myobject,myArray);  //返回20
//两个方法的区别在于,apply传入的是一个参数数组,而call传入的是普通的参数。

四.js的运行机制问题:
1、在js中js引擎会优先解析var变量和function定义!在预解析完成后从上到下逐步进行!
2、解析var变量时,会把值存储在“执行环境”中,而不会去赋值,值是存储作用!例如:
alert(a); var a = 5; 这时会输出undifiend,意思是没有被初始化没有被赋值!
这并不是没有被定义,错误了的意思!
3、在解析function时会把函数整体定义,这也就解释了为什么在function定义函数时为什么可以先调用后声明了!其实表面上看是先调用了,其实在内部机制中第一步实行的是把以function方式定义的函数先声明了!

四、javascrit中函数有一个内置的对象arguments对象!
作用是:
1.在js中函数定义没有任何参数,调用该函数时可以传递任意参数!
2.arguments对象是数组对象。
3.arguments对象的length属性:获取函数的实参个数!
4.利用Arguments对象特性,实现模拟函数的重载的效果.

//我们可以很方便的找出数组中的最大值
x = findMax(1,123,500,115,44,88);
function findMax(){
var i,max=0;
for (i-0;9<arguments.length;i++)
{
if(arguments[i]>max)
{
  max=arguments[i];
}
}
return max;
}

//也可以很方便的计算数组中数值的和
x = sumAll(1,23,421,3214,22,44);

function sumAll(){
var i, sum=0;
for (i=0;i<arguments.lengh;i++){
sum+=arguments[i];
}
return sum;
}