当前位置 博文首页 > 黑夜中的天空:JavaScript函数

    黑夜中的天空:JavaScript函数

    作者:黑夜中的天空 时间:2021-02-15 16:30

     

    1.1 JS continue 语句

    定义和用法

    • continue 用于跳过循环中的一个迭代,并继续执行循环中的下一个迭代。

    • continuebreak 语句的区别是:break 是结束整个循环体,continue是结束单次循环。

    但是,在执行 continue 语句时,表现出了两种不同类型的循环:

    1. while 循环中,会先判断条件,如果条件为 true,循环再执行一次。

    2. for循环中,自增长表达式(如:i++)会先计算,然后再判断条件是否为true,再决定是否执行迭代。

    continue 语句可应用于可选的标签引用。

    注意: continue 语句(不带标签引用),只能用在循环或 switch 中。

    循环代码块,在 i 的值等于 "3" 时跳过当前循环:

    2.1 JS break 语句

    定义和用法

    1. 循环代码块,break在变量 i 为 "3" 时退出循环:

    2. break 语句用于退出 switch 语句或循环语句(for, for ... in, while, do ... while)。

    3. 当 break 语句用于 switch 语句中时,会跳出 switch 代码块,终止执行代码。

    4. 当 break 语句用于循环语句时,会终止执行循环,并执行循环后代码(如果有的话)。

    5. break 语句同样可用于可选的标签引用,用于跳出代码块。

    注意: break 语句(不带标签引用),只能用在循环或 switch 中。

    3.1 JS arguments 对象

    定义和用法

    arguments是函数里的 可以通过数组下标的形参访问函数实参值
    arguments对象 没有表示参数集合,而是一个伪类数组
    arguments对象是 所有(非箭头)函数中都可用的局部变量
    此对象包含传递给函数的每个参数 第一个参数在索引0处。
    你可以使用arguments对象在函数中引用函数的参数。


    例如,如果一个函数传递了三个参数,你可以如下方式引用他们:

    1. arguments[0]

    2. arguments[1]

    3. arguments[2]

    求平均值:

    function avg() {
      var num = 0, j = 0;
      for (let i = 0; i <= arguments.length; i++) {
        if (typeof arguments[i] != 'number')
                 continue;
             num += arguments[i];
                 j++;
               }
                 num /= 1;
                 return num;
             }
     document.write(avg(1, 2, 3, 4)); 

    3.1.1 callee回调函数

           它如果和callee属性一起使用的话,利用它可以设计函数迭代操作。使用arguments.callee可以获取匿名函数。最后比较实参和形参的

    个数以检测用户传递的参数是否符合要求。如果不是匿名函数的话,则arguments.callee等价于函数名f())

    语法:

     [function.]arguments.callee 
    可选项 function 参数是当前正在执行的 Function 对象的名称。

    说明:

    callee 属性的初始值就是正被执行的 Function 对象。

           callee 属性是 arguments 对象的一个成员,是arguments的属性,该属性是一个指针,指向拥有arguments对象的函数,这有利于匿

    名函数的递归或确保函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。更有需要注意

    的是callee拥有length属性,这个属性有时候用于验证还是比较好的。arguments.length是实参度,arguments.callee.length是形参长

    度,由此能够判断调用时形参长度是否和实参长度一致。

    function calleeDemo() {
       alert(arguments.callee);
    }

    3.1.2 throw new Error()方法:在控制台里抛出错误提示。

    throw 语句允许我们创建自定义错误。正确的技术术语是:创建或抛出异常(exception)。

           如果把 throwtry catch 一起使用,那么您能够控制程序流,并生成自定义的错误消息。异常可以是 JavaScript 字符串、数字、

    逻辑值或对象。

      throw new Error('传递的参数不匹配'); 

    3.1.3 search() 搜索

    search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
    search() 方法 执行正则表达式和 String 对象之间的一个搜索匹配


            当你想要知道字符串中是否存在某个模式(pattern)时可使用 search(),类似于正则表达式的 test() 方法。当要了解更多匹配信息

    时,可使用 match()(但会更慢一些),该方法类似于正则表达式的 exec() 方法。

    语法

     stringObject.search(regexp) 

    参数

    描述

    regexp

    该参数可以是需要在 stringObject 中检索的子串,也可以是需要检索的 RegExp 对象。

    注释:要执行忽略大小写的检索,请追加标志 i。

    返回值

    stringObject 中第一个与 regexp 相匹配的子串的起始位置。

    注释:如果没有找到任何匹配的子串,则返回 -1。

    说明

           search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp lastIndex 属性,并且总是从字符串的开始进行检索,这

    意味着它总是返回 stringObject 的第一个匹配的位置。

    特别说明:

    1. 字符串中字符的位置与数组类似,都是从0开始的。

    2. searchValue不但可以是普通字符串,也可以是正则表达式,

    function isEmail() {
                if (arguments.length > 1) {
                    throw new Error('你只能传递一个参数');
                }
                var regexp = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
                if (arguments[0].search(regexp) != -1) {
                    return true;
                } else {
                    return false;
                }
            }
            var email = '13021946513@qq.com';
            if (isEmail(email)) {
                document.write(email);
            } else {
                document.write('请您重新输入邮箱地址');
            }

    4.1 使用函数对象

    4.1.1 获取函数形参个数

    1. 获取函数的实参个数:使用arguments对象的length属性,仅能够在函数体内使用。

    2. 获取形参的个数使用函数名.length或者a.callee.length,function对象的length属性在函数体内外都可以使用.

    function check(a) {
    if (a.length != a.callee.length) {
    throw new Error('参数不一致');
    }
    }
    function f(a, b, c, d) {
    check(arguments);
    return (a + b + c + d)
    }
    document.write(f(3, 4))

    4.2.1 自定义属性

    1. 用户可以通过点语法为函数定义静态属性和方法。

    2. 函数属性可以在函数体内定义,只能在内部调用;函数属性也可以在函数体外定义,在外部调用。

    3. 函数方法可以在内部或外部定义,不管在内部或外部定义都可以调用此函数方法。

    4. 用户不妨为函数定义属性,然后利用函数属性实现函数每次返回低增值。

    function f() {
    return f.x++;
    }
    f.x = 0;
    for (var i = 0; i < 10; i++) {
    document.write(f());
    }

    4.call()和apply()函数

    call()apply()是function对象的原型方法。把一个函数当做一个方法绑定到指定对象上并进行调用。

    具体用法如下:

     function.call(thisobj,args...) 

     function.apply(thisobj,args) 

           其中参数thisobj表示指定的对象,参数args表示要传递给被调用函数的参数。而call()方法只能接受多个参数列表,apply()只能接受一个数组

    或伪数组,数组元素将作为参数传递给被调用的函数。

    代码如下:

    function f(x, y) {
    return x + y;
    }
    function o(a, b) {
    return a * b;
    }
    document.write(f.call(o, 3, 4));

    使用call()和apply()方法可以把一个函数转换为指定对象的方法,并在这个对象上临时绑定调用该方法。

    提示:它们能够动态改变函数内this指代的对象,这在面向对象编程中是非常有用的。

    4.3.1 call()和apply()区别如下:

    1.  call()和apply()传递给参数的方式不同,

    2.  apply()是以数组形式传递参数,

    3. call()方法以多个值的形式传递参数。

    代码如下:

    function r(x) {
    return (x);
    }
    function f(x) {
    x[0] = x[0] + '>';
    return x;
    }
    function o() {
    var temp = r;
    r = function () {
    return temp.apply(this, f(arguments));
    }
    }
    function a() {
    o();
    document.write(r('='));
    }
    for (var i = 0; i < 10; i++) {
    a();
    }

    4.4 使用bind()

    函数function增加了一个原型方法bind(),是指用来把函数绑定到指定对象上。

    具体用法如下:

     function.bind(thisArg[,arg1[,arg2[,argN]); 

    参数说明如下:

    function

    必须参数,一个函数对象

    thisArg

    必须参数,this关键字可在新函数中引用的对象

    arg1[,arg2[,argN]]

    可选参数,要传递到新函数的参数的列表。

    bind方法将返回与函数相同的新函数不会立即执行,等需要的时候才会执行该新函数。bind()方法也可以多个或两个传递参数值。

    var displayArgs = function (val1, val2, val3, val4) {
    document.write(val1 + '<br> ' + val2 + ' <br>' + val3 + '<br> ' + val4 + '<br> ');
    }
    var emptyObject = {};
    var displayArg2 = displayArgs.bind(emptyObject, '姓名:' + '张亮', '年龄:' + 25 + '岁');
    displayArg2('身高:' + 180 + 'cm', '民族:' + ' ' + '汉族');

    4.4.1 JavaScript trim() 方法

    语法

     string.trim() 

    定义和用法

    trim()

    方法用于删除字符串的头尾空格。

    trim()

    方法不会改变原始字符串。

    实例:

    去除字符串的头尾空格:

    function myTrim(x) {
    
    return x.replace(/^\s+|\s+$/gm,'');
    
    }
     function myFunction() {
    var str = myTrim(" Runoob ");
    alert(str);
    }

    5.1 使用this

    this的定义:

    this是函数体内自带的一个对象指针,this指向当前调用函数的那个对象,或者指向类的当前实例。

    this的特点:

    1. 在function内部被创建

    2. 指向调用时所在函数所绑定的对象(拗口)

    3. this 不能被赋值,但可以被 call/apply  改变

    this的用途:这里把它所有用到的地方列出

    1. this 和构造器
    function Tab(nav, content) {
        this.nav = nav
        this.content = content
    }
    Tab.prototype.getNav = function() {
        return this.nav;
    };

          2. this 和对象

    var tab = {
        nav: '',
        content: '',
        getNav: function() {
            return this.nav;
        },
        setNav: function(n) {
            this.nav = n;
        }
    }

          3. this 和函数

    function showMsg() {
        alert(this.message)
    }
    var m1 = {
        message: '输入的电话号码不正确'
    }
    var m2 = {
        message: '输入的身份证号不正确'
    }
    showMsg.call(m1) // '输入的电话号码不正确'
    showMsg.call(m2) // '输入的身份证号不正确'

         4. 全局环境的 this

    var x = 10;
    function func() {
        alert(this.x)
    }
    var obj = {
        x: 20,
        fn: function() {
            alert(this.x)
        }
    }
    var fn = obj.fn
    func() // 10
    fn() // 10

           没错,最终输出的都是全局的10。永远记住这一点:判断 this 指向谁,看执行时而非定义时,只要函数(function)没有绑定在对象上调用,它的

    this就是window。

         5. this 和 DOM/事件

     <div id="nav" onclick="getId()">ddd</div> 

    <script>
    function getId() {
       alert(this.id)
    }
    </script>

           点击 div 后,为什么 id 是 undefined,不说是指向的当前元素 div 吗?如果记住了前面提到的一句话,就很清楚为啥是 undefined,把这句话再贴出来。判断 this 指向谁,看执行时而非定义时,只要函数(function)没有绑定在对象上调用,它的 this 就是 window。

    这里函数getId调用时没有绑定在任何对象上,可以理解成这种结构:

    div.onclick = function() {
        getId()
    }

    getId 所处匿名函数里的 this 是 div,但 getId 自身内的 this 则不是了。当然 ES5 严格模式下还是有个坑。

    6. this 可以被 call/apply/bind 改变

    var m1 = {
        message: 'This is A'
    }
    var m2 = {
        message: 'This is B'
    }  
    function showMsg() {
        alert(this.message)
    }
    showMsg() // undefined
    showMsg.call(m1) // 'This is A'
    showMsg.call(m2) // 'This is B'

    7.  me/self/that/_this 暂存 this

           如果采用 OOP 方式写 JS 代码,无可避免的会用到 this,方法内会访问类的内部属性(字段),也可能会调用类的另一个方法。当类的方法内又有一个 function 时,比如浏览器端开发经常遇见的给 DOM 元素添加事件,这时如果事件处理器(handler)中的想调用类的一个方法,此时 handler 内的 this 是 dom 元素而非类的当前对象。这个时候,需要把 this 暂存,开发者发挥着自己的聪明才智留下了几种经典的命名 me, self, that, _this

    如:一般会在每个方法的第一句就把 this 暂存下来。

    8. ES5 中新增的 bind 和 this

    var modal = {
        message: 'This is A'
    }
    function showMsg() {
        alert(this.message)
    }
    var otherShowMsg = showMsg.bind(modal)
    otherShowMsg() // 'This is A'
    
    下一篇:没有了