函数(JavaScript)

suaxi
2020-12-09 / 0 评论 / 89 阅读 / 正在检测是否收录...

1.1 定义函数

定义方式一

绝对值函数

function test(x){
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}
//一旦执行到return代表函数结束,返回结果
//如果没有执行return,函数执行完也会返回结果undefined
定义方式二
var test = funxtion(x){ //匿名函数,可以把结果赋值给test,通过test调用函数
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}
调用函数
test(10); //10
test(-10); //10

参数问题:Javascript可以传任意个参数,也可以不传参数

假设不存在参数,如何规避?

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

代表传递进来的所有参数是一个数组

var test = 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;
    }
}

arguments存在的问题:当需要使用多余的参数来进行附加操作时,需要排除已有的参数

rest

ES6之前的用法

if(arguments.length>2){}
    for (var i = 2; i<arguments.length; i++){
        ......
    }
}

ES6引入的新特性,获取除了已定义的参数之外的所有参数

function test(a,b,...rest) {
    console.log("a:"+a);
    console.log("b:"+b);
    console.log(rest);
}

rest只能写在最后面,必须用 ...rest 标识

1.2 变量的作用域

function test() {
    var x = 1;
    x = x + 1;
}
x = x + 2;
//Uncaught ReferenceError: x is not defined

变量x在函数体中声明,在函数体外不可以使用

如果两个函数使用的相同的变量名,只要在函数内部,就不冲突

内部函数可以使用外部函数的成员,反之不行

function test() {
    var x = 1;
    
    function test1() {
        var y = x + 1; //2
    }
    var z = y + 1; //Uncaught ReferenceError: x is not defined
}

假设内部函数变量和外部函数变量重名

function t() {
    var x = 1;
    function t1() {
        var x = '大写的一';
        console.log('inner:'+x); //inner:大写的一
    }
    console.log('outer:'+x); //outer:1
    t1();
}
t();

注:函数查找变量从自身函数开始,由”内“向”外“查找,如果外部存在同名的函数变量,则内部函数会屏蔽外部函数的变量

提升变量的作用域
function t(){
    var x = "abc" + y;
    console.log(x);
    var y = 'y';
}

结果会报错:x undefined

js执行引擎自动提升了y的声明,但是没有提升变量y的赋值

function t(){
    var y;
    var x = "abc" + y;
    console.log(x);
    y = 'y';
}

注:所有的变量定义都放在函数的头部,便于代码维护

全局函数
//全局变量
var x = 1;
function t(){
    console.log(x); //1
}
t();
console.log(x); //1

全局对象window

var x = 123;
alert(x);
alert(window.x); //默认所有的全局变量,都会自动绑定在winsow对象下

alert() 这个函数本身也是一个window变量

var x = '123';
window.alert(x);
var old_alert = window.alert;
window.alert = function (){
    
}
window.alert(123); //失效

//恢复
window.alert = old_alert;
window.alert(456);

JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),如果没有在函数作用范围内找到,就会向外查找,如果在全局作用域中也没有找到,会报错ReferenceError

规范
//唯一全局变量
var test = {};

//定义全局变量
test.name = '孙笑川';
test.add = function (a,b) {
    return a + b;
}

把自己的代码全部放入自己定义的唯一空间空间名字中,降低全局命名冲突的问题

局部作用域 let
function t() {
    for (var i = 0; i < 100; i++){
        console.log(i);
    }
    console.log(i); //101
}

ES6引入let关键字,解决局部作用域冲突问题

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

在ES6之前,全部用大写字母命名的变量就是常量

var PI = '3.14';
console.log(PI); //3.14
PI = 'abc';
console.log(PI); //abc,值改变

在ES6中引入关键字const

const PI = '3.14';
console.log(PI);
PI = 'abc'; //TypeError: Assignment to constant variable
console.log(PI);

1.3 方法

定义方法
//将函数放在对象中
var test = {
    name: 'sun',
    birth: 1988,
    //方法
    age: function () {
        var time = new Date().getFullYear();
        return time-this.birth;
    }
}

//属性
test.name
//调用方法
test.age()

this代表什么?

function getAge() {
    var time = new Date().getFullYear();
    return time-this.birth;
}

var test = {
    name: 'sun',
    birth: 1988,
    age: getAge
}

test.age() //2020-1988
getAge() //NaN

this是无法指向的,默认指向调用它的对象

apply

在js中控制this的指向

function getAge() {
    var time = new Date().getFullYear();
    return time-this.birth;
}

var test = {
    name: 'sun',
    birth: 1988,
    age: getAge
}

getAge.apply(test,[]); //this指向了test,参数为空
0

评论 (0)

取消