JS函数的定义

一 函数的定义

JavaScript三种定义函数方法:
*第一种 使用function语句定义函数
myFunction(5);
function myFunction(y) {
    return y * y;
}

第二种 使用Function()构造函数来定义函数(不常用)

var 函数名 = new Function(“参数1”,”参数2”,”参数3”……”函数体”);
如:
var 函数名 = new Function("x","y","var z=x+y;return z;");

*第三种 函数表达式

JavaScript 函数可以通过一个表达式定义。
函数表达式可以存储在变量中:
var 函数名 = function(参数1,参数2,…){函数体};
//例如:
//定义
    var add = function(a,b){
        return a+b;
    }
    //调用函数
    document.write(add(50,20));

第四种 自调用函数

函数表达式可以 "自调用"。
自调用表达式会自动调用。
如果表达式后面紧跟 () ,则会自动调用。
不能自调用声明的函数。
通过添加括号,来说明它是一个函数表达式:
实例:
(function () {
    var x = "Hello!!";      // 我将调用自己
})();
注意:
arguments 对象

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

例如:arguments
x = sumAll(1, 123, 500, 115, 44, 88);

function sumAll() {
    var i, sum = 0;
    for (i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}
关于变量和参数问题:
1. 函数外面定义的变量是全局变量,函数内可以直接使用
2. 在函数内部没有使用var定义的=变量则为全局变量
3. 在函数内使用var关键字定义的变量是局部变量,即出了函数外边无法获取。
函数支持默认值
4. 在函数内部定义的函数为局部函数 在函数外部不能获取到

二 JavaScript 闭包


JavaScript 变量可以是局部变量或全局变量。
私有变量可以用到闭包。
函数内部可以修改函数外部的全局变量

计数器困境

设想下如果你想统计一些数值,且该计数器在所有函数中都是可用的。

你可以使用全局变量,函数设置计数器递增:

var counter = 0;
 
function add() {
   return counter += 1;
}
 
add();
add();
add();
 
// 计数器现在为 3

但问题来了,页面上的任何脚本都能改变计数器,即便没有调用 add() 函数。

如果我在函数内声明计数器,如果没有调用函数将无法修改计数器的值:

function add() {
    var counter = 0;
    return counter += 1;
}
 
add();
add();
add();
// 本意是想输出 3, 但事与愿违,输出的都是 1 !

JavaScript 内嵌函数

所有函数都能访问全局变量。

实际上,在 JavaScript 中,所有函数都能访问它们上一层的作用域。

JavaScript 支持嵌套函数。嵌套函数可以访问上一层的函数变量。

该实例中,内嵌函数 plus() 可以访问父函数的 counter 变量:

实例:
function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();    
    return counter; 
}

JavaScript 闭包

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
 
add();
add();
add();
 
// 计数器为 3

实例解析

变量 add 指定了函数自我调用的返回字值。
自我调用函数只执行一次。设置计数器为 0。并返回函数表达式。
add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器。
这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。
计数器受匿名函数的作用域保护,只能通过 add 方法修改。
JS函数的定义_第1张图片
232323.png

你可能感兴趣的:(JS函数的定义)