JavaScript函数

  • 定义函数

    • 定义方式1
    function abs(x){
        if(x>=0){
            return x;
        }else{
            return -x;
        }
    }
    
    • 定义方式2:采用匿名内部类方式创建函数,直接通过变量名就可以调用函数
    var abs = function(x){
        if(x>=0){
            return x;
        }else{
            return -x;
        }
    }
    
  • 函数调用

    abs(10); //10
    abs(-10); //10
    
  • JavaScript不传参数或传递任意个参数都不会报错

    • 规避不传参数的问题
    var abs = function(x){
        //手动抛出异常
        if(typeof x !== 'number'){
            throw 'Not a Number';
        }
        if(x>=0){
            return x;
        }else{
            return -x;
        }
    }
    
    • 规避传任意个参数的问题
      • arguments代表传递进来的所有的参数,是一个数组
    var abs = function(x){
        if(arguments.lengt = 1){
            if(x>=0){
            return x;
        	}else{
            	return -x;
        	}
        }else{
            for(var i = 0; i < arguments.length; i++){
            	console.log(arguments[i]);
        	}
          throw 'Elements Over';
        }    
    }
    

    arguments包含所有的参数,ES6引入的新特性rest,可以获取除了已经定义的参数之外的所有参数

    function aaa(a,b,...rest){
        console.log(a);
        console.log(b);
        //rest参数只能写在最后面,必须用...标识,用来接收多余的参数
        console.log(rest);
    }
    
  • 变量的作用域

    • 函数体内声明的变量,函数体外不可以使用(如果非要使用,可以研究一下闭包
    function a(){
        var x = 1;
        x = x + 1;
    }
    x = x + 2; //Uncaught ReferenceError : x is not defined
    
    • 如果两个函数使用相同的函数名,只要在函数内部就不冲突
    function a(){
        var x = 1;
        x = x + 1;
    }
    function b(){
        var x = 'a';
        x = x + 1;
    }
    
    • 内部函数可以访问外部函数的成员,反之则不行
    function a(){
        var x = 1;
        function b(){
            var y = x + 1; //2
        }
        var z = y + 1; //Uncaught ReferenceError : y is not defined
    }
    
    • 函数查找变量从自身开始由内向外找,若外部存在同名的函数变量,则内部函数会屏蔽外部函数变量
    function a(){
        var x = 1;
        function b(){
            var x = 'a';
            console.log(x); //a
        }
        console.log(x); //1
        b();
    }
    
    • 全局变量window
    var x = 'xxx';
    alert(x);
    window.alert(x); //默认所有的全局变量都会自动绑定在window对象下
    
    • alert()函数本身也是一个window变量
    var x = 'xxx';
    window.alert(x);
    
    var old_alert = window.alert;
    
    window.alert = function(){
        
    }
    //alert失效了
    window.alert(123);
    
    //恢复alert
    window.alert = old_alert;
    window.alert(456);
    

    规范

    由于所有的全局变量都绑定在window上,如果不同的js文件使用了相同的全局变量,会引起冲突

    解决方法:把自己的代码全部放进自己定义的唯一空间名字中,降低全局命名冲突问题

    //定义一个代替window的变量
    var LiApp = {};
    
    //定义全局变量
    LiAPP.name = 'aaa';
    LiAPP.add = function(a,b){
        return a+b;
    }
    
    • 局部作用域let
    function aaa(){
        for(var i = 0; i < 100; i++){
            console.log(i);
        }
        console.log(i+1); //可以打印出来
    }
    

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

    function aaa(){
        for(let i = 0; i < 100; i++){
            console.log(i);
        }
        console.log(i+1); //Uncaught ReferenceError : i is not defined
    }
    
    • 常量const:只读变量

      • ES6之前全部用大写字母命名的变量就是常量
      var PI = '3.14';
      console.log(PI);
      PI = '123'; //可以改变
      console.log(PI);
      
      • ES6之后引入关键字const
      const PI = '3.14';
      console.log(PI);
      PI = '123'; //无法改变,会报错
      console.log(PI);
      
  • 方法

    • 方法就是把函数放在对象里面,对象里面只有两个东西:属性和方法
    var app = {
        name : 'aaa',
        birth : 1998,
        //方法
        age :function(){
            //今年 - 出生年
            var now = new Date().getFullYear();
            return now - this.birth;
        }
    }
    
    //属性
    app.name
    //方法,要带()
    app.age()
    
    • this是默认指向调用它的那个对象
    function getAge(){
        //今年 - 出生年
        var now = new Date().getFullYear();
        return now - this.birth;
    }
    var app = {
        name : 'aaa',
        birth : 1998,
        //方法
        age :getAge
    }
    
    //app.age(); 没问题
    //getAge(); NaN window中没有this.birth
    
    • apply:在js中可以控制this的指向
    function getAge(){
        //今年 - 出生年
        var now = new Date().getFullYear();
        return now - this.birth;
    }
    var app = {
        name : 'aaa',
        birth : 1998,
        //方法
        age :getAge
    }
    getAge().apply(app,[]); //this指向了app,参数为空
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Remote_Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值