JavaScript之函数

Stella981
• 阅读 728

      玩js自然要和函数打交到。函数嘛简单来说就是给代码分个块,方便调用、信息隐藏和代码复用,还可以用于指定对象的行为。另外函数还可以玩出很多花样来。。。

JavaScript 使用关键字 function定义函数。

定义一个函数:

//函数声明
//这种定义函数的好处是可以在当前作用域内任何位置调用,因为变量的声明和函数的声明都会被提升到当前作用域前面去执行。
function $id(id,fa){
    fa=fa || document;
    return document.getElementById(id);
}

//函数表达式
//这种方式其实就是定义了一个匿名函数(函数没有名称),然后把这个函数赋值给了一个变量,通常通过变量名来调用。
//这种方式只能在赋值给变量之后才能通过变量名调用。这就和我们平时声明变量和给变量赋值一个道理。
var $id=function(id,fa){
    fa=fa || document;
    return document.getElementById(id);
};

//构造函数
//这种方式我们一般没怎么用,如果要用这种方式,我们可以使用函数表达式代替
var $id=new Function('id','fa','fa=fa || document;return document.getElementById(id);');

    函数的参数:

/*
如果是Java语言,方法规定的参数是多少,就必须传多少,如果参数不一样,需要用到方法重载。但是js里面是没有方法重载的。
我们可以给函数传递任意多个参数,前提是你确定传这些参数你的函数都能正确处理。
而且我们在函数内获取传递进来的参数也可以通过一个arguments的对象来获取到传递进来的参数,
arguments对象不能显式创建,arguments对象只有函数开始时才可用。
函数的 arguments 对象并不是一个数组,访问单个参数的方式与访问数组元素的方式相同。
索引 n 实际上是 arguments 对象的 0…n 属性的其中一个参数。
除了参数意外,arguments还有一个callee属性,callee属性,返回正被执行的 Function 对象,
也就是所指定的 Function 对象的正文。callee 属性是 arguments 对象的一个成员,
仅当相关函数正在执行时才可用。callee 属性的初始值就是正被执行的 Function 对象,这允许匿名的递归函数。
*/
function calleeTest(){
    console.log(arguments[0]);
    arguments[0] +=1;
    if(arguments[0]<10){
        arguments.callee(arguments[0]);
    }
}
calleeTest(1);//1;2;3;4;5;6;7;8;9

    函数的调用:

//函数名加()就可以调用函数,这也是最常用的调用方式,()里面可以传我们需要的参数,如果传的个数比需要的少,
//那么方法里面多的参数就是undefined;如果传的参数数量比定义函数时规定的参数多,
//那么可以在函数内通过arguments访问到多余的参数。
$id('swfsocketdiv');
//在普通的函数调用方式中,函数的调用上下文(this的值),
//为全局对象(非严格模式)或者undefined(严格模式)。
function test(){
        console.log(this);
    function m(){
        console.log(this);
    }
    m();
}
test();//Window;Window;
//如果当前函数是一个匿名函数,还可以用自调用的方式调用,
(function(){
        console.log(this);
})()
//返回:Window对象,这种方式其实也算是普通的调用方式吧,只是看起来似乎不一样


//函数定义作为对象的属性,称之为对象方法。作为方法调用中,
//this指向当前对象。利用这一特性,我们可以在方法不需要明确的返回值时,直接返回this,从而实现"方法链"。
//函数内部如果还有函数,嵌套函数不会继承外层函数的this
var Selector={
    test:function(id,fa){
        console.log(this);
                function m(){
                console.log(this);
            }
            m();
    }
}
Selector.test();//Object { test: Selector.test() };Window;

//函数如果用于创建新的对象,称之为对象的构造函数。
function Student(name){
    this.sname=name;
    console.log(this);
}
//创建一个对象student
var student=new Student('ly');//Object { sname: "ly" }
//创建一个对象student2
var student2=new Student('lyong');//Object { sname: "lyong" }

//call,apply调用,如果某个对象有一个方法,而我在另一个对象中需要用到这么一个方法,
//但是我又不想在另一个对象中再重复一次这个方法,那么这时就可以使用call或者apply切换函数所处的上下文环境
function callMe(cname){
    this.cname=cname;
}
var cm=new callMe('testname');
Student.call(cm);//Object { cname: "testname", sname: undefined }
Student.call(cm,'test');//Object { cname: "testname", sname: "test" }
Student.apply(cm);//Object { cname: "testname", sname: undefined }
Student.apply(cm,['test']);//Object { cname: "testname", sname: "test" }

    至于函数的返回值,如果有则返回,没有返回undefined,和其他语言差别不大。

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章带你了解JavaScript作用域
在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域:这个作用域在函数内变化。一、本地JavaScript变量一个变量声明在JavaScript函数内部,成为函数的局部变量。局部变量有局部作用域:它们只能在函数中访问。JS://codeherecann
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
你不可不知的JS面试题(第三期)
1、什么是闭包?如图所示,闭包就是一个定义在函数内部的函数,其作用是将函数内部和函数外部连接起来。大家知道,作用域的问题,就是在函数内部定义的变量称为局部变量,外部取不到值。下面我们通过代码来更加详细地看一下:function A()       let x  1;       return function B()           c
小嫌 小嫌
3年前
Javascript中的变量提升
定义JavaScript中奇怪的一点是你可以在变量和函数声明之前使用它们。就好像是变量声明和函数声明被提升了代码的顶部一样。sayHi()//Hithere!functionsayHi()console.log('Hithere!')name'JohnDoe'console.log(name)//JohnDoevarn
Jacquelyn38 Jacquelyn38
3年前
重学JavaScript第1集|变量提升
变量提升就好比JavaScript引擎用一个很小的代码起重机将所有var声明和function函数声明都举起到所属作用域(所谓作用域,指的是可访问变量和函数的区域)的最高处。这句话的意思是:如果在函数体外定义函数或使用var声明变量。则变量和函数的作用域会提升到整个代码的最高处,此时任何地方访问这个变量和调用这个函数都不会报错;而在函数体内定义函数或使用va
菜园前端 菜园前端
1年前
为你解惑JS作用域和作用域链知识
原文链接:变量作用域一个变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是可以访问的。然而在函数内声明的变量只能在函数体内访问,它们是局部变量,作用域是局部性的。函数参数也是局部变
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
JavaScript基础2
普通的JavaScript对象是命名值的无序集合,JavaScript同样定义了一种特殊的对象数组array,表示带编号的值的有序集合,JavaScript为数组定义了专用的语法,使得数组具有区别于普通对象而独有的行为特性JavaScript还定义了另一种特殊对象函数,函数是具有与它相关联的可执行代码的对象,通过调用函数来运行可执行代码并返回运算结
小万哥 小万哥
8个月前
Go 语言函数、参数和返回值详解
函数是一组语句,可以在程序中重复使用。函数不会在页面加载时自动执行。函数将通过调用函数来执行。创建函数要创建(通常称为声明)一个函数,请执行以下操作:使用func关键字。指定函数的名称,后跟括号()。最后,在花括号内添加定义函数应执行的代码。语法Gofun