美文网首页
JavaScript学习笔记(四)——函数表达式

JavaScript学习笔记(四)——函数表达式

作者: 嘤嘤嘤666 | 来源:发表于2016-09-05 14:44 被阅读0次

    匿名函数

    var functionName = function(arg0, arg1,arg2){
      //do sth
    };
    

    作用:模仿块级作用域

    //用作会计作用域(私有作用域)的匿名函数的语法
    (function(){
      //这里是块级作用域
    })(); //函数声明加上括号即可
    
    function output(count){
      (function(){
        for(var i = 0; i < count; i++ ){
          console.log(i);
        }
      })();
    
      console.log(i); // 出错
    }
    

    递归

    function factorial(num){
      if (num <= 1 ){
        return 1;
      } else {
        return num * arguments.callee(num - 1); //使用arguments.callee而不是函数名的原因是函数名可能会发生变化
      }
    }
    

    严格模式下使用命名函数

    var factorial = (function f(num){
      if (num <= 1){
        return 1;
      } else {
        return num * f(num - 1);
      }
    });
    

    闭包

    闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包常见的方式,就是在一个函数内部创建另一个函数。

    当在函数内部定义了其他函数是,就创建了闭包。闭包有权访问包含函数内部的所有变量,原理如下:

    • 在后台执行环境中,闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域。
    • 通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。
    • 当函数返回了一个闭包是,这个函数的作用域将会一只在内存中保存到闭包不存在为止。
    function createFunctions(){
      var result = new Array();
      for (var i = 0; i < 10; i++ ){
        result[i] = function(){
          return i;
        };
      }
      return result;
    }
    
    var result = createFunctions();
    result.forEach(function(item, index, array){
      console.log(item());//10个10
    });
    

    每个函数都返回10,因为每个函数的作用域链中都保存着createFunctions()函数的活动对戏那个,所以它们引用的是同一个变量i。当createFunction()函数返回后,变量i的值都是10。

    通过定义匿名函数,并将立即执行该匿名函数的结果赋给数组可以解决这个问题:

    function createFunctions(){
      var result = new Array();
      for (var i = 0; i < 10; i++ ){
        result[i] = function(num){
          return function(){
            return num;
          };
        }(i);
      }
      return result;
    }
    
    var result = createFunctions();
    result.forEach(function(item, index, array){
      console.log(item());//0~9
    });
    

    作用:用于创建访问私有变量的公有方法。

    特权方法:有权访问私有变量和私有函数的公有方法

    //增强的模块模式
    var f = function(){
      //私有变量和私有函数
      var privateVar = 10;
    
      function privateFunction(){
        return false;
      }
    
      //创建对象
      var object = new CustomType();
    
      //添加特权/公有属性和方法
      object.publicProperty = true;
    
      object.publicMethod = function(){
        privateVar++;
        return privateFunction();
      };
    
      return object;
    
    }();
    

    this

    几种特殊情况下,this的值可能会意外改变。

    var name = "The Window";
    
    var object = {
      name : "Object",
    
      getName : function(){
        return this.name;
      }
    };
    
    object.getName(); // 'Object"
    (object.getName)(); // "Object"
    (object.getName = object.getName)(); //"The Window"
    

    相关文章

      网友评论

          本文标题:JavaScript学习笔记(四)——函数表达式

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