zoukankan      html  css  js  c++  java
  • JavaScript学习——JavaScript 函数

    JavaScript 函数

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。

    <!DOCTYPE html>
    <html>
    <head>
    <script>
    function myFunction()
    {
        alert("Hello World!");
    }
    </script>
    </head>
     
    <body>
    <button onclick="myFunction()">Try it</button>
    </body>
    </html>
    

    JavaScript 函数语法

    函数就是包裹在花括号中的代码块,前面使用了关键词 function:

    function functionname()
    {
    执行代码
    }
    

    当调用该函数时,会执行函数内的代码。

    可以在某事件发生时直接调用函数(比如当用户点击按钮时),并且可由 JavaScript 在任何位置进行调用。

    JavaScript 对大小写敏感。关键词 function 必须是小写的,并且必须以与函数名称相同的大小写来调用函数。

    调用带参数的函数

    在调用函数时,可以向其传递值,这些值被称为参数。

    这些参数可以在函数中使用。多的参数,由逗号 (,) 分隔:

    myFunction(argument1,argument2)
    

     声明函数时,请把参数作为变量来声明:

    function myFunction(var1,var2)
    {
    代码
    }
    

     变量和参数必须以一致的顺序出现。第一个变量就是第一个被传递的参数的给定的值,以此类推。

    <!DOCTYPE html>
    <html>	
    <head> 
    <meta charset="utf-8"> 
    <title>mtimeyu</title> 
    </head>
    <body>
    
    <p>点击这个按钮,来调用带参数的函数。</p>
    <button onclick="myFunction('mtime','程序员')">点击这里</button>
    <script>
    function myFunction(name,job){
    	alert("Welcome " + name + ", the " + job);
    }
    </script>
    
    	</body>
    </html>
    

     

    可以使用不同的参数来调用该函数,这样就会给出不同的消息:

    <!DOCTYPE html>
    <html>
    <head> 
    <meta charset="utf-8"> 
    <title>博客园mtimeyu</title> 
    </head>
    <body>
    
    <p>请点击其中的一个按钮,来调用带参数的函数。</p>
    <button onclick="myFunction('mtime','导演')">点击这里</button>
    <button onclick="myFunction('Dtt','编剧')">点击这里</button>
    <script>
    function myFunction(name,job)
    {
    	alert("Welcome " + name + ", the " + job);
    }
    </script>
    
    </body>
    </html>
    

     

    带有返回值的函数

    有时,我们会希望函数将值返回调用它的地方。

    通过使用 return 语句就可以实现。

    在使用 return 语句时,函数会停止执行,并返回指定的值。

    语法
    function myFunction()
    {
        var x=5;
        return x;
    }
    

     上面的函数会返回值 5。整个 JavaScript 并不会停止执行,仅仅是函数。JavaScript 将继续执行代码,从调用函数的地方。

     函数调用将被返回值取代:

    var myVar=myFunction();
    

    myVar 变量的值是 5,也就是函数 "myFunction()" 所返回的值。

    即使不把它保存为变量,也可以使用返回值:

    document.getElementById("demo").innerHTML=myFunction();
    

     "demo" 元素的 innerHTML 将成为 5,也就是函数 "myFunction()" 所返回的值。

    可以使返回值基于传递到函数中的参数:

    计算两个数字的乘积,并返回结果:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>mtime</title>
    </head>
    <body>

    <p>本例调用的函数会执行一个计算,然后返回结果:</p>
    <p id="demo"></p>
    <script>
    function myFunction(a,b){
        return a*b;
    }
    document.getElementById("demo").innerHTML=myFunction(4,3);
    </script>

    </body>
    </html>

    仅希望退出函数时 ,也可使用 return 语句。返回值是可选的:

    function myFunction(a,b)
    {
        if (a>b)
        {
            return;
        }
        x=a+b
    }
    

     如果 a 大于 b,则上面的代码将退出函数,并不会计算 a 和 b 的总和。

    局部 JavaScript 变量

    在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它。(该变量的作用域是局部的)。

    可以在不同的函数中使用名称相同的局部变量,因为只有声明过该变量的函数才能识别出该变量。

    只要函数运行完毕,本地变量就会被删除。

    全局 JavaScript 变量

    在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。

    JavaScript 变量的生存期

    JavaScript 变量的生命期从它们被声明的时间开始。

    局部变量会在函数运行以后被删除。

    全局变量会在页面关闭后被删除。

    JavaScript 函数定义

    JavaScript 使用关键字 function 定义函数。

    函数可以通过声明定义,也可以是一个表达式。

    JavaScript 函数可以通过一个表达式定义。

    函数表达式可以存储在变量中:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>mtimeyu</title>
    </head>
    <body>
    
    <p>函数可以存储在变量中:</p>
    <p id="demo"></p>
    <script>
    var x = function (a, b) {return a * b};
    document.getElementById("demo").innerHTML = x;
    </script>
    
    </body>
    </html>
    

     

    在函数表达式存储在变量后,变量也可作为一个函数使用:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>mtimeyu</title>
    </head>
    <body>
    
    <p>函数存储在变量后,变量可作为函数使用:</p>
    <p id="demo"></p>
    <script>
    var x = function (a, b) {return a * b};
    document.getElementById("demo").innerHTML = x(4, 3);
    </script>
    
    </body>
    </html>
    

     

    以上函数实际上是一个 匿名函数 (函数没有名称)。

    函数存储在变量中,不需要函数名称,通常通过变量名来调用。

    Function() 构造函数

    函数通过关键字 function 定义。

    函数同样可以通过内置的 JavaScript 函数构造器(Function())定义。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>mtimeyu</title>
    </head>
    <body>
    
    <p>JavaScrip 内置构造函数。</p>
    <p id="demo"></p>
    <script>
    var myFunction = new Function("a", "b", "return a * b");
    document.getElementById("demo").innerHTML = myFunction(4, 3);
    </script>
    
    </body>
    </html>
    

     不必使用构造函数。上面实例可以写成:

    <script>
    var myFunction = function (a, b) {return a * b}
    document.getElementById("demo").innerHTML = myFunction(4, 3);
    </script>
    

    很多时候,你需要避免使用 new 关键字。

    函数提升

     

    提升(Hoisting)是 JavaScript 默认将当前作用域提升到前面去的的行为。

    提升(Hoisting)应用在变量的声明与函数的声明。

    因此,函数可以在声明之前调用:

    myFunction(5);
    
    function myFunction(y) {
        return y * y;
    }
    

    自调用函数

    函数表达式可以 "自调用"。

    自调用表达式会自动调用。

    如果表达式后面紧跟 () ,则会自动调用。

    不能自调用声明的函数。

    通过添加括号,来说明它是一个函数表达式:

    (function () {
        var x = "Hello!!";      // 我将调用自己
    })(); 
    

     上述是一个 匿名自我调用的函数 (没有函数名)。

    函数可作为一个值使用

    JavaScript 函数作为一个值使用:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>mtimeyu</title>
    </head>
    <body>
    
    <p>函数可作为一个值:</p>
    <p>x = myFunction(4,3) 或 x = 12</p>
    <p>两种情况下,x 的值都为 12。</p>
    <p id="demo"></p>
    <script>
    function myFunction(a, b) {
        return a * b;
    }
    var x = myFunction(4, 3);
    document.getElementById("demo").innerHTML = x;
    </script>
    
    </body>
    </html>
    

     

    JavaScript 函数可作为表达式使用:

    <p>函数可作为一个表达式使用。</p>
    <p id="demo"></p>
    <script>
    function myFunction(a, b) {
        return a * b;
    }
    var x = myFunction(4, 3) * 2;
    document.getElementById("demo").innerHTML = x;
    </script>
    

    函数是对象

    在 JavaScript 中使用 typeof 操作符判断函数类型将返回 "function" 。

    但是JavaScript 函数描述为一个对象更加准确。

    JavaScript 函数有 属性 方法

    arguments.length 属性返回函数调用过程接收到的参数个数:

    <body>
    
    <p> arguments.length 属性返回函数接收到参数的个数:</p>
    <p id="demo"></p>
    <script>
    function myFunction(a, b) {
        return arguments.length;
    }
    document.getElementById("demo").innerHTML = myFunction(4, 3);
    </script>
    
    </body>
    

     

    toString() 方法将函数作为一个字符串返回:

    <body>
    
    <p> toString() 将函数作为一个字符串返回:</p>
    <p id="demo"></p>
    <script>
    function myFunction(a, b) {
        return a * b;
    }
    document.getElementById("demo").innerHTML = myFunction.toString();
    </script>
    
    </body>
    

     

    函数显式参数(Parameters)与隐式参数(Arguments)

    functionName(parameter1, parameter2, parameter3) {
        // 要执行的代码……
    }
    

    函数显式参数在函数定义时列出。

    函数隐式参数在函数调用时传递给函数真正的值。

    参数规则

    JavaScript 函数定义时显式参数没有指定数据类型。

    JavaScript 函数对隐式参数没有进行类型检测。

    JavaScript 函数对隐式参数的个数没有进行检测。

    默认参数

    如果函数在调用时未提供隐式参数,参数会默认设置为: undefined

    有时这是可以接受的,但是建议最好为参数设置一个默认值:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>mtimeyu</title>
    </head>
    <body>
    
    <p>设置参数的默认值。</p>
    <p id="demo"></p>
    <script>
    function myFunction(x, y) {
        if (y === undefined) {
            y = 0;
        }    
        return x * y;
    }
    document.getElementById("demo").innerHTML = myFunction(4);
    </script>
    
    </body>
    </html>
    

    或者,

    function myFunction(x, y) {
        y = y || 0;
    return x * y; }

     如果y已经定义 , y || 返回 y, 因为 y 是 true, 否则返回 0, 因为 undefined 为 false。

    Arguments 对象

    JavaScript 函数有个内置的对象 arguments 对象。

    argument 对象包含了函数调用的参数数组。

    通过这种方式可以很方便的找到最大的一个参数的值:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>mtimeyu</title>
    </head>
    <body>
    
    <p>查找最大的数。</p>
    <p id="demo"></p>
    <script>
    x = findMax(1, 123, 500, 115, 44, 88);
     
    function findMax() {
        var i, max = arguments[0];
        
        if(arguments.length < 2) return max;
     
        for (i = 0; i < arguments.length; i++) {
            if (arguments[i] > max) {
                max = arguments[i];
            }
        }
        return max;
    }
    document.getElementById("demo").innerHTML = x;
    </script>
    
    </body>
    </html>
    

     

    通过值传递参数

    在函数中调用的参数是函数的隐式参数。

    JavaScript 隐式参数通过值来传递:函数仅仅只是获取值。

    如果函数修改参数的值,不会修改显式参数的初始值(在函数外定义)。

    隐式参数的改变在函数外是不可见的。

    通过对象传递参数

    在JavaScript中,可以引用对象的值。

    因此我们在函数内部修改对象的属性就会修改其初始的值。

    修改对象属性可作用于函数外部(全局变量)。

    修改对象属性在函数外是可见的。

    JavaScript 函数调用

    JavaScript 函数有 4 种调用方式。

    每种方式的不同在于 this 的初始化。

    一般而言,在Javascript中,this指向函数执行时的当前对象。this 是保留关键字,你不能修改 this 的值。

     作为一个函数调用

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>mtime博客园</title>
    </head>
    <body>
    
    <p>
    全局函数 (myFunction) 返回参数参数相乘的结果:
    </p>
    <p id="demo"></p>
    <script>
    function myFunction(a, b) {
    	return a * b;
    }
    document.getElementById("demo").innerHTML = myFunction(10, 2); 
    </script>
    
    </body>
    </html>
    

     

    在 HTML 中默认的全局对象是 HTML 页面本身,所以函数是属于 HTML 页面。

    在浏览器中的页面对象是浏览器窗口(window 对象)。以上函数会自动变为 window 对象的函数。

    myFunction() 和 window.myFunction() 是一样的:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>mtimeyu</title>
    </head>
    <body>
    
    <p>全局函数 myFunction() 会自动成为 window 对象的方法。</p>
    <p>myFunction() 类似于 window.myFunction()。</p>
    <p id="demo"></p>
    <script>
    function myFunction(a, b) {
    	return a * b;
    }
    document.getElementById("demo").innerHTML = window.myFunction(10, 2); 
    </script>
    
    </body>
    </html>
    

     

    全局对象

    当函数没有被自身的对象调用时 this 的值就会变成全局对象。

    在 web 浏览器中全局对象是浏览器窗口(window 对象)。

    该实例返回 this 的值是 window 对象:

    <body>
    
    <p>在 HTML 中 <b>this</b> 的值, 在全局函数是一个 window 对象。</p>
    <p id="demo"></p>
    <script>
    function myFunction() {
    	return this;
    }
    document.getElementById("demo").innerHTML = myFunction(); 
    </script>
    
    </body>
    

     

    函数作为全局对象调用,会使 this 的值成为全局对象。
    使用 window 对象作为一个变量容易造成程序崩溃。

    函数作为方法调用

    在 JavaScript 中你可以将函数定义为对象的方法。

    以下实例创建了一个对象 (myObject), 对象有两个属性 (firstNamelastName), 及一个方法 (fullName):

    var myObject = {
        firstName:"John",
        lastName: "Doe",
        fullName: function () {
            return this.firstName + " " + this.lastName;
        }
    }
    myObject.fullName();         // 返回 "John Doe"
    

    fullName 方法是一个函数。函数属于对象。 myObject 是函数的所有者。

    this对象,拥有 JavaScript 代码。实例中 this 的值为 myObject 对象。

    使用构造函数调用函数

    如果函数调用前使用了 new 关键字, 则是调用了构造函数。

     看起来就像创建了新的函数,但实际上 JavaScript 函数是重新创建的对象:

    // 构造函数:
    function myFunction(arg1, arg2) {
        this.firstName = arg1;
        this.lastName  = arg2;
    }
     
    // This    creates a new object
    var x = new myFunction("John","Doe");
    x.firstName;                             // 返回 "John"
    

     构造函数的调用会创建一个新的对象。新对象会继承构造函数的属性和方法。

    构造函数中 this 关键字没有任何的值。
    this 的值在函数调用实例化对象(new object)时创建。

    作为函数方法调用函数

    在 JavaScript 中, 函数是对象。JavaScript 函数有它的属性和方法。

    call()apply() 是预定义的函数方法。 两个方法可用于调用函数,两个方法的第一个参数必须是对象本身。

    <!DOCTYPE html>
    <html>
    <body>
    
    <p id="demo"></p>
    
    <script>
    var myObject;
    function myFunction(a, b) {
        return a * b;
    }
    myObject = myFunction.call(myObject, 10, 2);    // 返回 20
    document.getElementById("demo").innerHTML = myObject; 
    </script>
    
    </body>
    </html>
    

    两个方法都使用了对象本身作为第一个参数。 两者的区别在于第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。

    在 JavaScript 严格模式(strict mode)下, 在调用函数时第一个参数会成为 this 的值, 即使该参数不是一个对象。

    在 JavaScript 非严格模式(non-strict mode)下, 如果第一个参数的值是 null 或 undefined, 它将使用全局对象替代。

    通过 call() 或 apply() 方法你可以设置 this 的值, 且作为已存在对象的新方法调用。

    JavaScript 闭包

    JavaScript 变量可以是局部变量或全局变量。

    私有变量可以用到闭包。

    全局变量

    函数可以访问由函数内部定义的变量,如:

    function myFunction() {
        var a = 4;
        return a * a;
    }
    

     函数也可以访问函数外部定义的变量,如:

    var a = 4;
    function myFunction() {
        return a * a;
    }
    

    后面一个实例中, a 是一个 全局 变量。

    在web页面中全局变量属于 window 对象。

    全局变量可应用于页面上的所有脚本。

    在第一个实例中, a 是一个 局部 变量。

    局部变量只能用于定义它函数内部。对于其他的函数或脚本代码是不可用的。

    全局和局部变量即便名称相同,它们也是两个不同的变量。修改其中一个,不会影响另一个的值。

    变量声明时如果不使用 var 关键字,那么它就是一个全局变量,即便它在函数内定义。

    变量生命周期

    全局变量的作用域是全局性的,即在整个JavaScript程序中,全局变量处处都在。

    而在函数内部声明的变量,只在函数内部起作用。这些变量是局部变量,作用域是局部性的;函数的参数也是局部性的,只在函数内部起作用。

    JavaScript 闭包

    还记得函数自我调用吗?函数会做什么?

    <body>
    
    <p>局部变量计数。</p>
    <button type="button" onclick="myFunction()">计数!</button>
    <p id="demo">0</p>
    <script>
    var add = (function () {
        var counter = 0;
        return function () {return counter += 1;}
    })();
    function myFunction(){
        document.getElementById("demo").innerHTML = add();
    }
    </script>
    
    </body>
    

     

    解析

    变量 add 指定了函数自我调用的返回字值。

    自我调用函数只执行一次。设置计数器为 0。并返回函数表达式。

    add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器。

    这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。

    计数器受匿名函数的作用域保护,只能通过 add 方法修改。

     闭包是可访问上一层函数作用域里变量的函数,即便上一层函数已经关闭。

  • 相关阅读:
    javascript:属性的操作
    javascript:Element 节点
    javascript:ParentNode 接口,ChildNode 接口
    javascript:NodeList 接口,HTMLCollection 接口
    javascript:Node接口
    javascript:DOM概述
    javascript:Promise 对象
    javascript:定时器
    javascript:异步操作概述
    javascript:严格模式
  • 原文地址:https://www.cnblogs.com/mtime2004/p/9744670.html
Copyright © 2011-2022 走看看