JS函数定义

函数

方法:对象(属性,方法)

函数:

4.1定义函数

定义方式一

绝对值函数

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

一旦执行return代表函数结束,返回结果!

如果没有执行return,函数执行完也会返回结果,结果就是undefined

定义方式二

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

function(x){...}这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数!

方式一和方式二是一样的

调用函数

abs(10)  //10
abs(-10)  //10

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

参数进来是否存在的问题?假设不存在参数如何规避? 可以手动抛出异常

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

arguments是一个JS免费赠送的关键字

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

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

arguments包含所有的参数,我们有时候想使用多余的参数来里德附加操作,需要排除已有参数

rest
//以前的
  function bbb(a,b) {
        console.log("a=>" + a);
        console.log("a=>" + b);
        if (arguments.length > 2) {
            for (let i = 2; i < arguments.length; i++) {
                //....

            }
        }
    }

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

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

4.2变量的作用域

在javascript中,var定义变量实际是有作用域的。

假设在函数体中声明,则在函数体外不可以使用 (非要想实现的话,后面用闭包

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

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

内部函数可以访问外部函数的成员,反之则不行

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

   //‘use strict‘;
    function qj() {
        let x = 1;

        function qj2() {
            let x = "A";
            console.log(‘inner‘+x); //outer1
        }
        console.log(‘outer‘+x);  //innerA
        qj2();
    }
    qj()

假设在JavaScript中函数查找变量从自身函数开始~,由”内“向”外“查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数变量。

提升变量的作用域

    function qj() {
        let x = ‘x‘ + y;
        console.log(x);
        let y = ‘y‘;
    }
结果:xundefined

说明:js执行引擎,自动提升了y的声明,但是不会提升就是y的赋值

function qj2() {
       let y;
       let x = ‘x‘ + y;
       console.log(x);
       y = ‘y‘;
   }

这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护

  function qj2() {
       let x = 1,
           y = x + 1,
           z,i;  //undefined
       //之后随意用
   }

全局函数

  ‘use strict‘;
   //全局变量
  let x = 1;
  function f() {
      console.log(x)
  }
  f()
    console.log(x)

全局对象window

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

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

   ‘use strict‘;
  let x = "xxx";
   window.alert(x);
  let old_alert= window.alert;
  //old_alert(x)
    window.alert = function () {

    };
    //发现alert()失效了
    window.alert(123);
    //恢复
    window.alert = old_alert();
    window.alert(456);

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

规范

由于我们所有的全局变量都会绑定到我们的window上。如果不同的js文件,使用了相同的全局变量,就会冲突~如何能够减少冲突?

  //唯一全局变量
  let xiao = {};
  //定义全局变量
    xiao.name = ‘xiao‘;
    xiao.add = function (a,b) {
        return a + b;
    }

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

局部作用域 let

   function aaa() {
        for (var i = 0; i <100 ; i++) {
            console.log(i)
        }
        console.log(i+1); //问题:i出了这个作用域还可以使用
    }

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

 function aaa() {
        for (let i = 0; i <100 ; i++) {
            console.log(i)
        }
        console.log(i+1); 
    }

建议都是用let去定义局部作用域的变量;

常量 const

在ES6之前 ,怎么定义常量:只有用全部大写字母命名的变量就是常量;建议不要修改这样的值

  let PI = ‘3.14‘;
  console.log(PI);
  PI = ‘321‘; //可以改变这个值
  console.log(PI);

在ES6引入了常量关键字const

 const PI = ‘3.14‘;//只读变量
  console.log(PI);

4.3, 方法

定义方法

方法就是把函数放在对象的里面,对象只有两个东西:属性和方法

    let xiao = {
        name: ‘李‘,
        bitrh: 2020,
        //方法
        age: function () {
            //今年-出生的年
         let now = new Date().getFullYear();
         return now-this.bitrh;
        }
    }
 //属性
    xiao.name
    
//方法,一定要带()
xiao.age()
    

this,代表什么意思,拆开上面的代码

 function getAge () {
        //今年-出生的年
        var now = new Date().getFullYear();
        return now-this.bitrh;
    }
        var xiao ={
        name: ‘李‘,
        bitrh: 2020,
        age:getAge

    }

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

apply

在js中可以控制this指向

function getAge () {
        //今年-出生的年
        var now = new Date().getFullYear();
        return now-this.bitrh;
    }
        var xiao ={
        name: ‘李‘,
        bitrh: 2000,
        age:getAge
    };
    getAge.apply(xiao,[]); //this,指向了xiao,参数为空

转载https://www.cnblogs.com/a546558309/p/9614436.html

JS函数定义

上一篇:使用selenium模仿登录,执行js


下一篇:aos.js 转帖自用