zoukankan      html  css  js  c++  java
  • 7. javacript高级程序设计- 函数表达式

    1. 函数表达式

    1.1 函数定义

    函数定义的方式有两种:一种是函数声明,另一种就是函数表达式。

    (1). 函数声明:函数声明的重要特征就是函数声明提示,函数声明会在函数执行前执行

    function functionName(arg0,arg1,arh2){

    //函数体

    }

    (2). 函数表达式

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

    //函数体

    }

    1.2 递归

    递归函数是在一个函数通过名字调用自身的情况下构成的,例如:

    function factorial(num) {

           if (num <= 1) {

                  return 1;

           } else {

                  return num * factorial(num - 1);

           }

    }

    但是下面的代码出导致出错,

    var anotherFactorial = factorial;

    factorial = null;

    alert(anotherFactorial(4)); //error

    arguments.callee是一个指向正在执行的函数的指针,可以利用它来实现对函数的递归调用

    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);

           }

    })

    1.3 闭包

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

    1.3.1 闭包与变量

    闭包只能取得包含函数中任何变量的最后一个值

     

    function createFunctions(){

        var result = new Array();

     

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

           result[i] = function(){

               return i;

           }

        };

     

        return result;

    }

    以上函数每个值取得都是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;

    }

    1.3.2 关于this对象

    this对象是在运行时基于函数的执行环境绑定的,在全局变量中,this等于window,而当函数在被作为某个对象的方法调用时,this等于那个对象,不过,匿名函数的执行环境具有全局性,因此其this通常指向window。

    1.4 模仿块级作用域

    javascript中没有块级作用域的概念,匿名函数可以用来模仿块级作用域。

    用来模仿块级作用域(通常称为私有作用域)的匿名函数的语法如下所示:

    (function(params){

        //块级作用域

    })(params)

    1.5 私有变量

    严格来说javascript中没有私有成员的概念,所有的对象属性都是公共的,不过,在任何函数中定义的变量都是私有的,通过在函数中定义变量来实现私有变量。

     

    var obj = function() {

        var privateVar = 10;

     

        function privateFunc() {

           return false;

        }

     

        return {

           publicProperty: true.

     

           publicMethod: function() {

               privateVar++;

               return privateFunc();

           }

        }

    }();

  • 相关阅读:
    【转】从源码分析Handler的postDelayed为什么可以延时?
    android系统中如何通过程序打开某个AccessibilityService
    【转】在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()
    【转】Android 增,删,改,查 通讯录中的联系人
    【转】Android调用Sqlite数据库时自动生成db-journal文件的原因
    【转】Android辅助功能AccessibilityService自动全选择文字粘贴模拟输入
    【转】Android中保持Service的存活
    Multi-label && Multi-label classification
    第2章 排序 || 第17节 三色排序练习题
    第2章 排序 || 第15节 有序数组合并练习题
  • 原文地址:https://www.cnblogs.com/SLchuck/p/4457844.html
Copyright © 2011-2022 走看看