zoukankan      html  css  js  c++  java
  • js007-函数表达式

    js007-函数表达式

    本章内容

    1、函数表达式的特征

    2、使用函数实现递归

    3、使用闭包定义私有量

    定义函数的方式有两种:一:函数声明,二:函数表达式

    函数声明:

    function functionName( arg0, arg1, arg2){

           //函数体

    其中function是关键字 functionName:函数名;参数

    关于函数声明,一个重要特征是函数声明提升:执行代码之前先读取函数声明;这意味着可以吧函数声明放在调用它的语句后面

    sayHi();

    function sayHi(){

           alert("Hi!");

    }

    不会抛出错误因为:函数声明提升

    函数表达式:

    var functionName = function( arg0, arg1, arg2){

           //函数体

    }

    创建一个函数并将它赋值给变量functionName

    匿名函数

    理解函数声明提升的关键是理解函数声明和函数表达之间的区别。

     

    7.1递归

    递归函数时在一个函数通过名字调用自身的情况下构成的。

    function factorial(num){

           if (num <= 1) {

                  return 1;

           }else{

                  return num * factorial(num - 1);

           }

    }

     

     

     

     

     

     

     

    7.2闭包

    闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的最常见的方式,是:在一个函数内部创建另一个函数仍以前面的createComparisonFunction()函数为例。

    function createComparisonFunction(propertyName){

           return function(object1, object2){

                  var value1 = object1[propertyName];

                  var value2 = object2[propertyName];

                  if (value1 < value2) {

                         return -1;

                  }else if (value1 > value2) {

                         return 1;

                  }else{

                         return 0;

                  }

           };

    }

    黑体是内部函数,它们访问了外部函数中的变量propertyName

    7.2.1 闭包与变量

    因为作用链的原因,闭包只能取得包含函数中任何变量的最后一个值.而闭包所保存的是整个的变量对象,而不是某个特殊变量

    function createFunction(){

           var result = new Array();

           for (var i = 0; i < 10; i++) {

                  result[i] = function(){

                         return i;

                  };

           }

           return result;

    }

    表面上看,每个函数都返回自己的索引值。但是事实上每个返回的都是10因为每个函数的作用域链中都保存着createFunction()函数的活动对象,所以他们引用的都是同一个变量i

    可以通过常见一个匿名函数强制让闭包的行为符合预期:

    function createFunction(){

           var result = new Array();

           for (var i = 0; i < 10; i++) {

                  result[i] = function(num){

                         return function(){

                                return num;

                         };

                  }(i);

           }

           return result;

    }

    定义一个匿名函数,并将执行该匿名函数的结果传给数组,匿名函数有一个参数num,是最终要返回的值。

    7.2.2 关于this对象

    this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,当函数被某个兑现的的方法调用是,this等于那个对象。匿名函数的执行环境具有全局性。

    var name = "the windos";

    var object = {

           name: "My Object",

           getNameFunc : function(){

                  return function(){

                         return this.name;

                  };

           }

    };

    alert(object.getNameFunc()()); //"the windows"  (非严格模式下)

    name: "My Object",是逗号!!

    字面量方法定义对象里面的属性,用逗号隔开。定义一个对象后后分号结束。

    一条执行语句之后用分号结束

    var name = "the windos";

    var object = {

           name: "My Object",

           getNameFunc : function(){

                  var that = this;

                  return function(){

                         return this.name;

                  };

           }

    };

    alert(object.getNameFunc()()); //"My Object"

    吧外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了。

    this值可能会被意外的改变,在集中特殊情况下:

    var name = "the windos";

    var object = {

           name: "My Object",

           getNameFunc : function(){

                  return this.name;

           }

    };

    object.getNameFunc(); //"My Object"

    (object.getNameFunc)(); //"My Object"

    (object.getNameFunc= object.getNameFunc)(); //"the windos"

    第三句是什么意思(object.getNameFunc = object.getNameFunc)(); //"the windos"

    7.2.3 内存泄露

    闭包会引用包含函数的整个活动对象,其中包含着element,及时闭包不引用element包含函数的活动对象也仍然会保存一个引用,所以要把element变量设置为null,这样能够接车对DOM对象的引用,顺利地减少其引用书,确保正常收回其占用的内存。

    7.3模仿块级作用域

    JS没有块级作用域的概念,意味着块语句中定义的变量,实际上是包含在函数中而给语句中创建的。

    function outputNumbers(count){

           for (var i = 0; i < count; i++) {

                  alert(i);

           }

           alert(i); //计数

    }

    块级作用域(私有作用域)匿名函数的语法如下:

    (function(){

           //这里是块级作用域

    })();

    函数声明不能加圆括号,函数表达式可以添加圆括号。要把函数声明变成函数表达式可以如下做法

    函数声明

    函数表达式

    function(){ //这里是块级作用域}();//出错

    (function(){ //这里是块级作用域})();

    私有作用域可以用于历史需要一些变量时:

    function outputNumbers(count){

           (function(){

           for (var i = 0; i < count; i++) {

                  alert(i);

           })();

           alert(i); //导致错误

    }

    for循环外面插入了一个私有作用域,匿名函数中定义的任何变量都会在执行结束时被销毁

     

     

     

     

     

    7.4 私有变量  (举例子,还未完成)

    在JS中,所有对象属性都是公有的。不过,有一个私有变量的概念。任何函数中定义的变量,都可以认为是私有变量。因为外部函数无法访问该变量

    7.4.1 静态私有变量

    初始化一个未声明的变量总是会创建一个全局变量,全局变量能够在私有作用域外被访问到。在严格模式下,未经声明的变量赋值会导致错误

    7.4.2模块模式

    模块模式是为单例创建私有变量和特权方法。单例:只有一个实例的对象。

    7.4.3 增强的模块模式

    在返回对象之前加入对其增强的代码。这种增强的模块模式适用那些单例必须是魔种类型的实例,同时还必须添加某些属性和方法对其加以曾强的情况

    原文地址:http://www.cnblogs.com/lal-fighting/p/5147679.html

  • 相关阅读:
    删除购物车列表页面商品
    购物车页面修改数量功能实现
    cookie来实现购物车功能
    wxWidgets学习计划
    正则校验表达式
    Vue组件间的参数传递与Vue的路由实现
    Vue实现数据双向绑定的原理
    Vue的生命周期
    对于mvvm的理解
    vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
  • 原文地址:https://www.cnblogs.com/lal-fighting/p/5147679.html
Copyright © 2011-2022 走看看