• 声明函数的方法 之 语句定义法(函数声明法)和表达式定义法(函数表达式)


    一、函数的定义:

    在说明什么是函数前先举一个小例子:

    大家都知道印刷术是我国的四大发明(科普一下:中国四大发明:造纸术、印刷术、火药、指南针)之一,之所以有印刷术,是因为重复的抄写既浪费时间,效率又很低,所以印刷术应用而生,印刷术就像一个工具,有了这个工具,我们就不需要再重复的去抄写一些一模一样的内容。

    今天所说的函数就类似于印刷术,我们在书写代码时发现,在实现同一个功能时,所用的代码几乎是一样的,因为实际需要,所以不得不重复的去书写一样的代码,这时我们书写的代码看起来很冗杂,会占据内存空间,解析的时间也会很长,所以,为了使我们的代码书写的更美观,我们可以将我们的代码封装起来,给它一个命名,放在一个独立的模块里,需要使用时拿过来就OK了!

    比如说我们在不使用任何循环语句直接想打印5次“hello world!”时,这时我们就需要重复输出5次“hello world!”,代码如下:

    document.write(('hello world!')+"</br>");
    document.write(('hello world!')+"</br>");
    document.write(('hello world!')+"</br>");
    document.write(('hello world!')+"</br>");
    document.write(('hello world!')+"</br>");

    接下来我们封装一个函数来打印“hello world!”

    function helloworld(){
    document.write(('hello world!')+"</br>");
    }
    helloworld()
    helloworld()
    helloworld()
    helloworld()
    helloworld()
    很明显:我们用函数来打印“hello world”,不用再重复的书写一样的代码,只需要使用的时候调用就OK了!
    函数的定义:需要反复使用的功能代码,封装成一个独立的模块,这个模块就叫函数。

    二、声明函数的方法:

    用function来定义函数

    我们了解了什么是函数后,接着来看一下怎么声明函数,通俗点说就是怎么使用这个函数:

    1.语句定义法:

    其实我们在打印“hello world”时使用的方法就是语句定义法

    格式:function 函数名(){

         函数块;

    }

    调用:函数名()

    2.表达式定义法:

    一说表达式,肯定是和赋值有关,我们可以大胆的猜想一下,表达式定义法是不是就是我们将一个函数赋值给了一个变量呢?

    看一下它的格式:

    var 变量名 = function[函数名](){

        函数块;

    }

    调用:变量名()

    注意:var后面的是它声明的这个变量的变量名,不是函数名,函数名还是在function后面,之所以将函数名写在[]中,是因为在表达式定义法中,函数名是可以省略的,通常情况下,函数名我们也都是省略不写的。

    语句定义法和表达式定义法在以后的使用中,语句定义法会更常用。

    为什么说语句定义法更常用呢,这就要说一下语句定义法和表达式定义法的区别了:

    3、语句定义法和表达式定义法的区别:

    语句定义法会提升函数,会在执行代码前读取函数声明,通俗讲就是我们可以在任何位置调用这个函数;

    //person() 函数前调用     //张三
    function person(){
    var name = "张三";
    alert(name);
    }
    person() //函数后调用    //张三

    表达式定义法不会提升函数,必须先声明函数,再调用;

    //person(); 报错:控制台输出person is not a function
    var person = function(){
    var name = "张三";
    alert(name);
    }
    person(); //张三

    函数声明运行规则:

    函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ ... })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。

    下面简单说说函数声明与函数表达式的异同。声明和表达式的行为存在着十分微妙而又十分重要的差别。

      首先,函数声明会在任何表达式被解析和求值之前先行被解析和求值。即使声明位于源代码中的最后一行,它也会先于同一作用域中位于最前面的表达式被求值。还是看个例子更容易理解。在下面这个例子中,函数 fn 是在 alert 后面声明的。但是,在alert 执行的时候,fn已经有定义了:

    alert(fn()); //输出Helloworld!  
     
    function fn() {
    return 'Helloworld!';
    }
    简单总结,区别在什么地方呢?
    
    1. 声明总是在作用域开始时先行解析;
    2. 表达式在遇到时候才运算。
    
    函数声明还有另外一个重要的特点,即通过条件语句控制函数声明的行为并未标准化,因此不同环境下可能会得到不同的结果。即是:
    // 千万不要这样做!
    // 不同浏览器会有不同返回结果,
     
    if (true) {
    function foo() {
    return 'first';
    }
    }
    else {
    function foo() {
    return 'second';
    }
    }
    foo();
     
     
    // 记住,这种情况下要使用函数表达式:
    var foo;
    if (true) {
    foo = function() {
    return 'first';
    };
    }
    else {
    foo = function() {
    return 'second';
    };
    }
    foo();

    由于存在上述限制,只要函数出现在块中(像上面例子中那样),实际上就应该将其看作一个语法错误,而不是什么函数声明或表达式。

      

      那么我们应该在什么时候使用函数声明或函数表达式呢?函数声明只能出现在“程序代码”中,意味着只能在其它函数体中或者全局空间;它们的定义不能不能赋值给一个变量或属性,或者作为一个参数传递出现在函数调用中;下面的例子是函数声明的允许的用法,foo(),bar()和local()都是通过函数声明模式声明:

    // 全局环境
    function foo() {}
     
    function local() {
    // 局部环境
        function bar() {}
            return bar;
    }

    当你在语法上不能使用函数声明的时候,你就可以使用函数表达式。比如:传递一个函数作为参数或者在对象字面量中定义一个函数:

    // 这是一个匿名函数表达式
    callMe(function () {
     
    //传递一个函数作为参数
    });
     
    // 这是一个具名函数表达式
    callMe(function me() {
     
    // 传递一个函数作为参数,函数名为me
    });
     
    // 其他函数表达式
    var myobject = {
        say: function () {
     
    // I am a function expression
    }
    };
    
    
  • 相关阅读:
    C++基础学习1-编译与链接
    html学习
    使用BP拦截POST请求包
    2019.9.17
    搭建LAMP环境
    2019.9.16
    2019.9.12
    2019.9.11
    手脱无名壳tslgame_rl
    一款自制壳的脱壳
  • 原文地址:https://www.cnblogs.com/itgezhu/p/11590109.html
Copyright © 2020-2023  润新知