zoukankan      html  css  js  c++  java
  • JavaScript基础函数的声明(014)

    1.函数的重要地位

    函数(functions)在JavaScript里有着重要的地位,其原因有二:
    • 它们是一种特殊的对象
    • 它们提供作用域
    说函数在JavaScript里是特殊的对象,因为:
    • 程序的执行时期可以动态创建函数对象;
    • 函数对象可以赋给变量,通过变量可以再传递给其它变量,还可以被删除;
    • 函数对象可作为其它函数的形参,也可以作为函数的返回值;
    • 函数对象可以有自己的属性和方法(methods)。
    例如,(实际编程中完全可以这样做)对于JavaScript的函数A来说,它是个对象;它有自己的属性和方法,这个方法又是个函数,叫函数B;函数B接受另一个函数C作为形参,当B执行完后,返回一个新的函数D。这就是JavaScript函数的强大和灵活之处。
    函数还可以使用它的构造函数Function,被new出来(但我们不推荐这么做):
    // antipattern
    // for demo purposes only
    var add = new Function('a, b', 'return a + b');
    add(1, 2); // returns 3
    

    在上面的代码中,add是个对象,因为它是new操作的结果;但它又是个函数,因为它可以通过传递形参,执行计算任务。
    说函数可以提供作用域,这 也很重要。因为在JavaScript里,两个成对的花括号并不像C程序那样提供局部的作用域,而在JavaScript里,只有函数才能提供类似的功 能。例如,在函数内部用var声明的变量都是局部变量,对外不可以见,类似于Java里的private属性。而在全局的if或for循环的花括号里,用 var声明的变量都是全局变量。
    2. 关于函数的术语
    JavaScript的函数很强大,所以我们有必要对它的使用方法给出统一的术语。比如下面的代码展示了一个“有名函数表达式”(named)

    function expression):
    // named function expression
    var add = function add(a, b) {
        return a + b;
    };
    

     如果上面的代码里略去函数的名字add(也就是第二个add),就变成了一个“匿名函数表达式”( unnamed function expression),也称为“匿名函数”(anonymous function)。

    // function expression, a.k.a. anonymous function
    var add = function (a, b) {
        return a + b;
    };
    

     上面的两个例子,可以统称为“函数表达式”,而“有名函数表达式”只是函数表达式的一种特殊情况,事实上,声明时略去了函数的名字并不影响函数的定义以及后续的调用执行。如果声明时没有略去函数的名字,我们可以通过add.name得到它的名字,这对于程序调试时可能会有用。
    另外,还有一种叫“函数声明”,它和函数表达式非常类似:

    function foo() {
        // function body goes here
    }
    

     语法上,“函数声明”,和“函数表达式”都是函数的字面声明法(Literal),它们的语法区别只在于后面的分号,而在使用上的区别只有在实际的程序中才能体现出来。那我们应选择使用哪一种声明法呢?如果作为形参或是对象中的方法,那没得选,只能使用函数表达式了:

    // this is a function expression
    // pased as an argument to the function `callMe`
    callMe(function () {
        // I am an unnamed function expression
        // also known as an anonymous function
    });
    
    
    // this is a named function expression
    callMe(function me() {
        // I am a named function expression
        // and my name is "me"
    });
    
    
    // another function expression
    var myobject = {
        say: function () {
            // I am a function expression
        }
    };
    

     一个函数声明和函数表达式在使用上的区别是声明上提的现象。比如,当在一个函数A里面进行函数B声明,不管函数B声明在哪里,都可以在A内部的任意位置调用;类似的,当一个函数A里执行函数B的表达式,只有在表达式后面的代码才可以调用函数B。下面的例子说明了这个问题:

    // antipattern
    // for illustration only
    
    // global functions
    function foo() {
        alert('global foo');
    }
    function bar() {
        alert('global bar');
    }
    
    function hoistMe() {
        console.log(typeof foo); // "function"
        console.log(typeof bar); // "undefined"
    
        foo(); // "local foo"
        bar(); // TypeError: bar is not a function
    
        // function declaration:
        // variable 'foo' and its implementation both get hoisted
            alert('local foo');
        }
    
        // function expression:
        // only variable 'bar' gets hoisted
        // not the implementation
        var bar = function () {
            alert('local bar');
        };
    }
    hoistMe();
    

     3. 函数的name属性
    如果是声明的是有名的函数,则可以使用函数对象的name属性:

    function foo() {} // declaration
    var bar = function () {}; // expression
    var baz = function baz() {}; // named expression
    
    foo.name; // "foo"
    bar.name; // ""
    baz.name; // "baz"
    

    name属性在调试程序的时候使用,也可以在函数体内递归调用的时候使用。

  • 相关阅读:
    第15.9节 PyQt学习入门:使用Qt Designer进行GUI设计的步骤
    PyQt学习随笔:Model/View开发时在view数据项中设置不同角色数据的方法
    PyQt学习随笔:Model/View开发时从Model相关类派生自定义类需要注意的问题
    PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项
    PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法
    Python中高级知识(非专题部分)学习随笔
    clistctrl 虚拟列表
    数字图象处理图片库
    MFC中char*,string和CString之间的转换
    图像分割之(四)OpenCV的GrabCut函数使用和源码解读
  • 原文地址:https://www.cnblogs.com/Bryran/p/3964889.html
Copyright © 2011-2022 走看看