JavaScript函数

JavaScript函数

一.函数的定义

创建函数有两种方式第一种就直接定义函数

function abs(x) {
     
    if(x>=0) {
     
        return x;
    } else {
     
        return -x;
    }
}

这里是定义了一个abs求绝对值的函数

var abs = function(x) {
     
    if(x>=0) {
     
        return x;
    } else {
     
        return -x;
    }
}

这里的函数是匿名函数,相当于将匿名函数的结果赋值给了变量abs,这里是第二种函数定义方式。

二.参数

在JavaScript中参数可以传递任意个,也可以不传出,那么我们如何修改传入后存在问题的参数,或者是去规避一些不存在的参数
还是拿abs函数来举例子

var abs = function(x) {
     
    //手动抛出异常来判断
    if(typeof x!== 'number') {
     
        throw 'Not a Number';
    }
    if(x>=0) {
     
        return x;
    } else {
     
        return -x;
    }
}

绝对值函数针对的是 数字,但是如果传入字符串就没法使用函数,那么在这里我们手动添加一个if语句来规避这个问题

接下来就是js里面一个重要的功能arguments,获取所有的参数,并且以数组的形式存储下来,前面说过,js的数组包容性很强,他可以同时存储不同类型的变量

var abs = function(x) {
     
    console.log("x=>"+x);
    for(var i=0;i<arguments.length;i++) {
     
        console.log(arguments[i]);
    }
    if(x>=0) {
     
        return x;
    } else {
     
        return -x;
    }
}

但是这样写,在调用所需参数后,想要用余下的参数时,一定要先排除已有的参数,这个时候我们就需要rest来帮助我们实现获取除了已经定义的参数之外的所有的参数

function f(a,b,...rest) {
     
    console.log("a=>"+a);
    console.log("b=>"+b);
    console.log(rest);
}

这个就是获取ab之后所有的参数
注意:rest必须放到末尾,前面加上…

三.作用域

函数内部变量不能在外部使用

function f() {
     
    var x = 1;
}
x = x + 2

这样运行结果就是x未定义

function f() {
     
    var x = 1;
}
function f2() {
     
    var x = 'A';
}

因为两个x都是在不同函数内部所以不会冲突

内部函数可以访问外部变量,但是外部函数不能访问内部变量

function f() {
     
    var x = 1;
    function f3() {
     
        var y = x+1;//2
    }
        var z = y+1;

这样写就是y未定义

内外部变量重名时不会互相影响

function f1() {
     
    var x = 1;
    function f2() {
     
        var x = 'A';
        console.log('inner'+x);//innerA
    }
    console.log('outer'+x);//outer1
}

JS中函数变量查找是从自身开始的,由“内”向“外”查找,假设外部存在同名的函数变量,则内部函数会自动屏蔽外部函数

上面是局部变量,下面来说说全局变量

要说全局变量首先全局对象,window,默认所有的全局变量都会绑定在window对象中,

var x = "xxx";
window.alert(window.x);

JS只有一个全局作用域,任何变量(函数其实也可以视为变量),假设没有在函数范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错RefrenceError

所有的全局变量都会绑定在window上,不同的js文件,使用了相同的全局变量,就会产生冲突,这样我们就需要一种规范

let局部作用域(ES6关键字),解决局部作用域的冲突问题:

function aa() {
     
    for (var i = 0;i<100;i++) {
     
        console.log(i);
    }
    console.log(i+1);//101
}

var:i出了这个作用域还可以使用

function aa() {
     
    for (let i = 0;i<100;i++) {
     
        console.log(i);
    }
    console.log(i+1);//Uncaught ReferenceError: i is not defined
}

const常量

ES6之前定义常量,只有用全部大写字母定义的就叫常量
ES6出现了const关键字,

const pi = "3.14";
pi = "123";

这样的pi就是一个常量,是不可修改的,所以在给pi赋值的时候就会报错。

你可能感兴趣的:(javascript)