函数

函数:即方法

函数就是一段预先设置的功能代码块,可以反复调用,根据输入参数的不同,返回不同的值。

为什么使用函数:

1.方便调用

2.代码重用,利于维护

3.便于修改,便于重构

4.简化逻辑,利于编程

1、声明函数

声明函数 Function Declaration 的三种方法

1)function 命令

function print(s) {
    document.write(s+"<br/>");
}

2)函数表达式

var printStr =function(str){
    document.write(str+"<br/>");
}

这种写法将一个匿名函数赋值给变量。这时,这个匿名函数又称函数表达式(Function Expression),因为赋值语句的等号右侧只能放表达式。

3)Function 构造函数 : 入门级别用的不多….

var add = new Function('x','y','return (x + y)');

// 等同于

function add(x, y) {
    return (x + y);
}
var foo = new Function(
    'return "hello world"'
);

// 等同于

function foo() {
    return "hello world";
}

注意:不能在条件语句中声明函数

函数名的提升

JavaScript 引擎将函数名视同变量名,所以采用 function 命令声明函数时,整个函数会像变量声明一样,被提升到代码头部。所以,下面的代码不会报错。

f();
function f() {}

表面上,上面代码好像在声明之前就调用了函数 f。但是实际上,由于“变量提升”,函数 f 被提升到了代码头部,也就是在调用之前已经声明了。但是,如果采用赋值语句定义函数,JavaScript 就会报错。

f();
var f = function (){};// TypeError: undefined is not a function

2、函数的调用

函数的调用:圆括号运算符

函数名([实参]);

存在返回值可以变量接收

print()
printStr("goodgoodstudy");
var result =add(1,2);

3、参数

参数: 形参与实参 函数运行的时候,有时需要提供外部数据,不同的外部数据会得到不同的结果,这种外部数据就叫参数。"种瓜得瓜种豆得豆",使用时实参可以省略。

function square(x) { //x 为形参
    return x * x;
} square(2) // 4 2 为实参 square(3) // 9 function f(a, b) {
    return a;
}
//实参可以省略
f(4, 2, 3) // 1
f(10) // 1
f() // undefined

同名参数:取最后的一个

function f(a, a) {
    console.log(a);
} f(1, 2) // 2

默认值:使用 || 或运算

function f(a){
    a = a || 1;
    return a;
} f('') // 1
f(0) // 1 //更精确写法
function f(a){
    (a !== undefined && a !== null) ? a = a : a = 1;
    return a;
}

值传递(passes by value):值的副本

var box= 2;
function f(a) {
    a = 3;
} f(box);
console.log(box) // 2 没有改变
//思考 对象值的改变
var obj = {p: 1};
function f(o) {
    o.p = 2;
}
f(obj);
console.log(obj.p) // 2 //思考
var obj = [1, 2, 3];
function f(o){
    o = [2, 3, 4];
} f(obj);
console.log(obj) // [1, 2, 3]

arguments 对象: 获取所有的参数,可以看成数组。由于 JavaScript 允许函数有不定数目的参数,所以我们需要一种机制,可以在函数体内部读取所有参数。这就是 arguments 对象的由来。

var f = function(a) {
    for(var i in arguments){
        console.log(arguments[i]);
    }
} f(1,2,3);

了解: callee

var add =function(){
    //获取调用者
    console.log(arguments.callee === add); //是否为自己调用
}
add();

4、 return 语句

是函数的返回值。return 语句不是必需的,如果没有的话,该函数就不返回任何值,或者说返回 undefined。

5、递归( recursion)

函数自己调用自身

函数头:尽头 函数体:重复执行

function print(num){
    if(num==10){ //递归头
        return ;
    }
    //递归体
    console.log(num);
    print(num+1);
} print(1);

6、函数的地位

函数的地位是第一等公民

函数与其他数据类型完全是平等的,所以又称函数为第一等公民

function add(x, y) {
    return x + y;
} // 将函数赋值给一个变量
var operator = add; // 将函数作为参数和返回值
function a(op){
    return op;
} a(operator)(1, 1)// 2

7、函数的属性和方法

name:函数名

length:参数个数

toString(): 返回源码

8、函数作用域

函数作用域:全局(global variable)和局部(local variable)

var a =1; //全局变量
function display(){
    var b=2; //局部变量
    c =3; //没有 var 为全局变量 ,调用完成后 c 就存在了
    console.log(a+"-->"+b);
} display();
//b 不能访问
console.log(a+"-->"+c);

就近原则:

var v = 1;

function f(){
    var v = 2;
    console.log(v);
} f(); // 2
console.log(v); // 1

变量提升

function foo(x) {
    if (x > 100) {
        var tmp = x - 100;
    }
}

//等同于

function foo(x) {
    var tmp;
    if (x > 100) {
        tmp = x - 100;
    };
}

函数本身的作用域:函数本身也是一个值,也有自己的作用域。它的作用域绑定其声明时所在的作用域。

var a = 1;

var x = function (){
    console.log(a);
}; function f(){
    var a = 2;
    x();
} f() // 1

9、方法的调用

方法的调用: apply call :调用一个对象的一个方法,以另一个对象替换当前对象。二者的区别在于参数是否为数组

function Animal(age){
    this.name = "Animal";
    this.showName = function(){
           alert(this.name);
    }
} function Cat(){
    this.name = "Cat";
} var animal = new Animal(); var cat = new Cat(); //通过 call 或 apply 方法,将原本属于 Animal 对象的 showName()方法交给对象 cat 来使用了。 //输入结果为"Cat" animal.showName.call(cat,"10");
// 等同于apply方法中参数为数组
animal.showName.apply(cat,[10]);

10、 eval

执行字符串,将字符串当作语句执行。

eval('var a = 1;');
alert(a); // 1

了解 jsonp 的使用:

var jsonp = 'foo({id:42})';

var f = new Function( "foo", jsonp );

// 相当于定义了如下函数
/*
function f(foo) {
    foo({id:42});
}*/ //业务处理 var print=function(json){
    console.log( json.id ); // 42
} f(print);
//相当于
function f(print){
    json = {id:42};
//    print(json);
    console.log(json.id);
}

上面代码中,jsonp 是一个字符串,Function 构造函数将这个字符串,变成了函数体。调用该函数的时候,jsonp 就会执行。这种写法的实质是将代码放到函数作用域执行,避免对全局作用域造成影响。(上海尚学堂,原文首发至:公众号 嗨码歌)

JavaScript基础内容中的函数详解的更多相关文章

  1. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  2. 【转】linux 中fork()函数详解

    在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...

  3. Linux中fork()函数详解(转载)

    linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  4. C++中重载函数详解

    函数的重载详解 什么时函数重载: 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避 ...

  5. php中magic_quotes_gpc函数详解

    magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post.get.cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊 ...

  6. python unittest框架中addCleanup函数详解

    接上一篇doCleanups说明,这次介绍下另一个很好用的函数:addCleanup 还是老规矩,看官方文档说明: addCleanup(function, *args, **kwargs)¶ Add ...

  7. python中groupby函数详解(非常容易懂)

    一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...

  8. Linux C 中 fork() 函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork() 函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...

  9. JQuery中on()函数详解

    JQuery API中定义的on方法,专业名词很多,读起来并不是那么容易,而对于开发人员知道函数怎么使用就可以了.本文将JQuery的说明翻译如下: on(events,[selector],[dat ...

随机推荐

  1. JS的ES7支持

    1.指数运算符(幂): ** 2.Array.prototype.includes(value) : 判断数组中是否包含指定value console.log(2**4); let arr = [2, ...

  2. 渗透测试工具Nmap篇

    Nmap是一款网络扫描和主机检测的非常有用的工具. Nmap是不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器.它可以适用于winodws,linux,mac等操作系统.Nmap ...

  3. [Gamma]Scrum Meeting#9

    github 本次会议项目由PM召开,时间为6月4日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客,组织例会 撰写博客,组织例会 swoip 前端显示屏幕,翻译坐 ...

  4. 【VS开发】【C/C++开发】关于boost库的C++11导致的undefined符号问题

    undefined reference to boost::program_options::options_description::m_default_line_length 问题最终解决依靠的是 ...

  5. Maven 教程(19)— Maven的六类属性

    原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79776666 内置属性 主要有两个常用内置属性:${basedir}项目的根目录 ...

  6. Spring的JdbcTemplate使用教程

    Spring对数据库的操作在jdbc上面做了基本的封装,让开发者在操作数据库时只需关注SQL语句和查询 结果处理器,即可完成功能(当然,只使用JdbcTemplate,还不能摆脱持久层实现类的编写). ...

  7. Lab_1:练习5——实现函数调用堆栈跟踪函数

    题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址.如 ...

  8. 红黑树和AVL树的区别(转)

    add by zhj: AVL树和红黑树都是平衡二叉树,虽然AVL树是最早发明的平衡二叉树,但直接把平衡二叉树等价于AVL树,我认为非常不合适. 但很多地方都在这么用.两者的比较如下 平衡二叉树类型 ...

  9. Python批量更改文件名

    一.问题在处理文件或者一些其他信息的时候我们需要更改文件名,那么我们可以写一个程序来修改这些文件名,以减少我们重复的做一件事. 二.解决本次使用的Python,利用的是Python中的OS模块,具体操 ...

  10. golang---命令源码文件与命令行参数

    命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的. import "flag"  flag包实现了命令行参数的解析.每个参数认为一条记录,根据实际进行定义,到一个se ...