美文网首页
javascript之函数

javascript之函数

作者: Mcq | 来源:发表于2019-06-21 20:33 被阅读0次
  • 函数内部this的指向的几种情况
  • 改变函数内部的this(call、bind、apply的区别)

函数基础

创建和调用函数

  • 函数声明:
    • function 函数名(形参){// 函数体中的代码 }
  • 函数表达式:
    • var 函数名 = function(形参){// 函数体中的代码 }
  • 调用
    • 函数名(实参)

函数的参数

  • 形参:函数定义时,标识符,可以理解为函数内部的局部变量
  • 实参:函数调用时,实际的数据

函数的返回值

  • 关键字:return
  • 函数内部默认没有写return,默认返回undefined
  • 作用:返回值,结束函数执行。

作用域

  • 全局作用域

    • 函数之外的执行环境
    • 全局变量:可以在任何地方使用。
  • 局部作用域

    • 函数内部的执行环境
    • 局部变量:仅仅只能在函数内体使用
    • 注意:把形参理解为局部变量
  • 作用域链:

    在访问一个变量时,会先从本作用域中去找,若找不到,则找向上层作用域,以此类推。

变量提升

  • 把var关键字声明变量名,仅仅是变名,提升到当前作用域的顶部,所以在当前作用于只能访问到该变量名,而不能访问到变量所代表的值。
  • 函数声明创建的函数整体会提升到当前作用域顶部

匿名函数和自调用函数

  • 没有名字的函数
    • 匿名函数一般要配合运算符使用,否则语法报错,比如在function前加+
    • 匿名函数定义好之后,要马上调用,否则没有意义。
  • 自调用函数
    • 注意:有名字的或匿名的函数都可以自调用。
  • 匿名函数的作用:
    • 可以避免全局变量污染。(命名冲突)
    • 可以模拟块级作用域。
  • 递归调用:
    • arguments.callee()
    • 严格模式下:用小名var recursion=function fn(){fn()}

一. 函数也是对象

  • 函数的另外一种创建方式

    • 语法:
==var 变量名 = new Function('参数1','参数2',...,'函数体中的代码');== 
  • 代码:

        //【函数声明】
         function fn(a,b) {
          console.log(a + b);
           console.log(a + b);
           console.log(a + b);
           console.log(a + b);
         }  
         fn(10,20);
    
        // 函数是一种数据类型吗? 
        // 答:是,类型 Function 
    
        // new关键字-创建方式
        // 语法:var 变量名 = new Function('参数1','参数2',...,'函数体中的代码');
        //var fn = new Function('a','b','console.log(a + b);');
        // 调用
        // fn(10,20);
    
        // 扩展:eval('字符串代码');  把字符串代码解析成真正意义的js代码执行
        // 'alert(1)';
        // eval('alert(1)');
    

二. 函数内部this的指向

​ 在此,this是在函数内部研究

​ 函数内部的this不是在函数定义时决定的,而是在函数调用执行时决定的。

2.1 普通函数中this的指向

      function fn() {
        console.log(this);
      }
     fn();  // window

      var fn = function(){
        console.log(this);
      };
      fn(); // window

      (function(){
        console.log(this);
     })(); // window

     function fn1() {
        var fn2 = function() {
          console.log(this);
      }
      fn2(); // window
     }
      fn1();

2.2 定时器中this的指向

     【定时器中的this指向window】
      setTimeout(function(){
        console.log(this);
      },10);

2.3 构造函数中this指向

this指向当前创建的对象。 要去理解new关键字的创建过程

    function Student(name,age) {
      this.name = name;
      this.age = age;
    }
    Student.prototype.sayHi = function() {
      console.log('我叫' + this.name);
    };
    var stu1 = new Student('张三',18);
    var stu2 = new Student('李四',18);

2.4 方法中this指向

this指向方法的调用者。

    function Student(name,age) {
      this.name = name;
      this.age = age;
    }
    Student.prototype.sayHi = function() {
      console.log('我叫' + this.name);
    };
    var stu1 = new Student('张三',18);
    var stu2 = new Student('李四',18);


    // 【在调用一个方法时→对象.方法名(); 方法内部this指向调用者】
    stu1.sayHi();  // 张三
    stu2.sayHi();  // 李四

2.5 事件处理程序中this指向

this指向事件源。 事件触发后(函数才会执行)才知道

    // 【事件处理程序→ this指向事件源】
    document.onclick = function() {
      console.log(this);  // document
    };

三. 改变this的指向

3.1 call方法

  • 语法:==函数名.call(调用者,参数1...)==

  • 作用:函数被借用时,会立即执行,并且函数体内的this会指向借用者或调用者

  • 代码:

        // 定义一个函数
        function fn(name, age) {
          this.name = name;
          this.age = age;
        }
    
        // 定义一个自己的对象
        var obj = {};   // 字面量
        fn.call(obj, '李四', 10);
    

3.2 apply方法

  • 语法:==函数名.apply(调用者,[参数1...])==

  • 作用:函数被借用时,会立即执行,并且函数体内的this会指向借用者或调用者

  • 代码:

        // 定义一个函数
        function fn(name, age) {
          this.name = name;
          this.age = age;
        }
    
        // 定义一个自己的对象
        var obj = {};   // 字面量
        fn.apply(obj, ['李四', 10]);
    

3.3 bind方法

  • 语法:==函数名.bind(调用者,参数1...)==

  • 作用:函数被借用时,不会立即执行,而是返回一个新的函数。需要自己手动调用新的函数。

    • 返回函数
  • 代码:

        // 定义一个函数
        function fn(name, age) {
          this.name = name;
          this.age = age;
        }
    
        // 定义一个自己的对象
        var obj = {};   // 字面量
        fn.bind(obj, '李四', 10)();
    

应用

  1. 伪数组借用数组的push方法实现增加

  2. 使用Math对象max方法取出数组中的最大数字

  3. 作业:伪数组借用数组的reverse方法实现反转

四.函数的其他属性

  • 函数名.arguments

    获取用户传入的实参

  • 函数名.length

    获取函数形参的个数

  • 函数名.name

    函数的名字

相关文章

网友评论

      本文标题:javascript之函数

      本文链接:https://www.haomeiwen.com/subject/taldfctx.html