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从全局对象中取得。

  • 相关阅读:
    【转+补充】在OpenCV for Android 2.4.5中使用SURF(nonfree module)
    Delphi StarOffice Framework Beta 1.0 发布
    Angular ngIf相关问题
    angularjs文档下载
    公众号微信支付开发
    公众号第三方平台开发 教程六 代公众号使用JS SDK说明
    公众号第三方平台开发 教程五 代公众号处理消息和事件
    公众号第三方平台开发 教程四 代公众号发起网页授权说明
    公众号第三方平台开发 教程三 微信公众号授权第三方平台
    公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取
  • 原文地址:https://www.cnblogs.com/zbly/p/9948244.html
Copyright © 2011-2022 走看看