zoukankan      html  css  js  c++  java
  • 函数类型

    函数类型

    在ECMAScript 中有三种函数类型:函数声明,函数表达式和函数构造器创建的函数。每一种都有自己的特点。

    1.函数声明

    //函数声明(缩写为FD)是这样一种函数:
    //1.有一个特定的名称
    //2.在源码中的位置:要么处于程序级(Program level),要么处于其它函数的主体(FunctionBody)中
    //3.在进入上下文阶段创建
    //4.影响变量对象
    //5.以下面的方式声明

    function exampleFunc() {}

     这种函数类型的主要特点在于它们仅仅影响变量对象。该特点也解释了第二个重要点(它是变量对象特性的结果)在代码执行阶段它们已经可用(因为FD在进入上下文阶段已经存在于VO中——代码执行之前)。

    例如(函数在其声明之前被调用)

    foo();
     
    function foo() {
      alert('foo');
    }

    第二点函数声明在源码中的位置:

    // 函数可以在如下地方声明:
    // 1) 直接在全局上下文中
    function globalFD() {
      // 2) 或者在一个函数的函数体内
      function innerFD() {}
    }

    2.函数表达式

    //函数表达式(缩写为FE)是这样一种函数:
    //在源码中须出现在表达式的位置
    //有可选的名称
    //不会影响变量对象
    //在代码执行阶段创建

    这种函数类型的主要特点在于它在源码中总是处在表达式的位置。最简单的一个例子就是一个赋值声明:

    var foo = function foos() {
      ...
    };

    在外部FE通过变量“foo”来访问foo(),而在函数内部,有可能使用名称“foos”。

    如果FE有一个名称,就很难与FD区分。但是,如果你明白定义,区分起来就简单明了:FE总是处在表达式的位置。在下面的例子中我们可以看到各种ECMAScript 表达式:

    // 圆括号(分组操作符)内只能是表达式
    (function foo() {});
     
    // 在数组初始化器内只能是表达式
    [function bar() {}];
     
    // 逗号也只能操作表达式
    1, function baz() {};

     表达式定义里说明:FE只能在代码执行阶段创建而且不存在于变量对象中,示例:

    // FE在定义阶段之前不可用(因为它是在代码执行阶段创建)
     
    alert(foo); // "foo" 未定义
     
    (function foo() {});
     
    // 定义阶段之后也不可用,因为他不在变量对象VO中
     
    alert(foo);  // "foo" 未定义

    在表达式中使用它们,”不会污染”变量对象。最简单的例子是将一个函数作为参数传递给其它函数。

    function foo(callback) {
      callback();
    }
     
    foo(function bar() {
      alert('foo.bar');
    });
     
    foo(function baz() {
      alert('foo.baz');
    });

     3.通过函数构造器创建的函数

    这种函数的[[Scope]]属性仅包含全局对象:

         var x = 10;
    
            function foo() {
    
                var x = 20;
                var y = 30;
    
                var bar = new Function('alert(x); alert(y);');
    
                bar(); // x:10, y:未定义
    
            }
            foo()

    函数bar的[[Scope]]属性不包含foo上下文的Ao的变量y不能访问,变量x从全局对象中取得。

  • 相关阅读:
    不同长度的数据进行位运算
    Linux的sleep()和usleep()的使用和区别
    linux inode已满解决方法
    Debian 系统修改语言设置成英文
    IIS设置问题
    Ajax实现跨域访问的三种方法
    HTML--备忘点
    C#基础---值类型和引用类型
    dapper.net框架使用随笔
    WebService的搭建,部署,简单应用和实体类结合使用
  • 原文地址:https://www.cnblogs.com/zbly/p/9948244.html
Copyright © 2011-2022 走看看