JavaScript高级[通俗易懂]

JavaScript高级[通俗易懂]一、高级函数1、函数回调函数回调的本质:在一个函数中,当满足一定的条件,回调函数会当作调用函数的参数传入下面这个例子,faa作为回调函数,fbb作为调用函数。在JavaScript中内置的调用函

大家好,又见面了,我是你们的朋友全栈君。

 

一、高级函数

  1、函数回调

  函数回调的本质:在一个函数中,当满足一定的条件,回调函数会当作调用函数的参数传入

  下面这个例子,faa作为回调函数,fbb作为调用函数。在JavaScript中内置的调用函数已经给我们写好了,我们只需写好fbb(回调函数)就好,就算你不写也不出错。

<script>
    function faa(data) {
        console.log('执行faa函数');//判断函数是否执行
        var start_time = new Date().getTime();
        var stop_time = new Date().getTime();
        //设置执行数据处理数据的时间为3s
        while (stop_time-start_time <3000) {
            stop_time = new Date().getTime();
        }
        var time = stop_time - start_time;
        console.log(data);
        console.log('一共耗时',time)

    }

    function fbb(func) {
        var data = 'fbb的数据';
        if (func) {
            func(data)
        } else {
            console.log('没有设置回调函数');
        }
    }

    fbb(faa)

</script>

  既然已经写到了函数的回调,那么再写一个面向对象的回调

<script>

    var web = {
        recved: null,
        send: function () {
            console.log('开始请求数据');

            // 这里模拟请求数据花费的时间
            start_time = new Date().getTime();
            stop_time = new Date().getTime();
            while (stop_time - start_time < 3000) {
                stop_time = new Date().getTime();
            }

            var data = '请求得到后的数据';

            if (web.recved && data) {
                web.recved(data);
            } else {
                console.log('回调函数没有定义');
            }
        }
    };
    web.recved = function (data) {
        console.log(data);
    };
    web.send();

</script>

  上面这个例子,首先写一个对象,写好它的属性,方法。假如send方法就是内置的,早已经写好的方法,我们执行web.send(),虽然产生数据,但是最为程序员的我们并没有写处理这个数据的方法,所以我们为recved编写了一个处理数据方法,再去执行web.send(),这样产生的数据就能处理了。

  再说,比如事件的绑定,我们为className为div的div标签绑定鼠标点击事件

  在我们没有给div的点击事件写相应的函数时,程序并没报错,一旦为其添上方法,我们在触发该事件的话,那么我们写的方法会作为回调函数去执行。

  2、函数的闭包

  闭包目的:不允许提升变量作用域时,该函数的局部变量需要被其他函数使用

  闭包本质:函数的嵌套,内层函数称为闭包

  闭包的解决案例:①影响局部变量的生命周期,持久化局部变量 ②解决变量污染

//这就是闭包,一个函数想使用另一个函数局部变量
function faa() {
    var date = [1,2,3,4];
    function fbb() {
        console.log(date)
    }
    fbb();
}
faa();
//通过闭包,可以提升函数内部的局部变量
function faa() {
    var data = '获取到的数据';
    function fbb() {
        return data
    }
    fbb();
}

var a = faa();
console

 

二、循环绑定

<body>
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</body>
<script>
    var lis = document.querySelectorAll('li');
    for (var i = 0 ; i < lis.length;i++) {
        lis[i].onClick = function () {
            alert(i);
        }
    }
</script>
/*你在页面点击li标签,会弹出5,上面全部都是弹出5 为什么会这样,就是循环绑定出现的变量污染,var是ES5中定义变量的方法,是没有块级作用域的,当for循环结束时,i就等于5*/

//我们可以通过闭包函数去解决这个问题
<script> var lis = document.querySelectorAll('li'); for (var i = 0 ; i < lis.length;i++) {
    (function(i){ lis[i].onclick = function () { alert(i); };
    })(i) } </script>
/*我们将为为li标签绑定点击事件的方法,写出一个闭包函数,外函数就是一个匿名函数的自调用。循环一次,先是匿名函数自调用一次,产生一个局部空间存放函数体代码,这样循坏5次,就产生了五个不同局部空间的
函数,当触发点击事件,就去执行相对应的回调函数,所引弹出的是它对应的索引值*/

//我们可以通过对象的属性去解决变量污染问题
<script> var lis = document.querySelectorAll('li'); for (var i = 0 ; i < lis.length;i++) {
    lis[i].index = i;
    lis[i].onclick = function() {
      alert(this.index)
    };
  }
</script>
//前面说了var定义的变量是无块级作用域的,我们可以通过ES6的语法,let去解决变量污染问题
<script>
 let lis = document.querySelectorAll('li'); 
  for (let i = 0 ; i < lis.length;i++) {
    lis[i].onclick = function () {
      alert(i);
    }
  }  </script>

 

三、面向对象Js

<script>
    //定义两个空对象
    var obj1 = {};
    var obj2 = new Object();
var zhuyu = {
    name:'zhuyu',  
    age : '21',
  } //创建一个zhuyu对象
  //查看属性的方法:zhuyu.name zhuyu['age']
  //添加/修改属性的方法:zhuyu.age = '22' 添加:zhuyu.sex = 'male'
  //删除属性的方法:delete zhuyu.sex
  //方法的添加修改删除和属性一样。方法的调用直接对象名.方法名()

  //构造函数,相当于python中面向对象的类
  //ES5中
  function People(name,age,sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.eat = function () {
            console.log('eat.......');
          }
    }
  //JavaScript的面向对象也有继承,多态,封装三大特性。
  简单写写继承:子级里继承父级属性,父级.call(this,name,age);
         子级里继承父级方法,子级.prototype = new 父级;

  //ES6中
  clsaa People() {
    constructor(name,age) {
      this.name = name;
      this.age = age;
    }
    //实例方法
    eat() {console.log('eat........')}
    //类方法
    static do() {'do.....'}
  }
  
</script>

 

四、定时器

//setInterval(持续性定时器)
//setInterval(函数, 毫秒数, 函数所需参数(可以省略));
var timer = setInterval(function() {console.log("呵呵");}, 1000)


//setTimeout(一次性定时器)
//setTimeout(函数, 毫秒数, 函数所需参数(可以省略));
setTimeout(function (data) {console.log(data);}, 1000, "数据");

//清除定时器
clearTimerout()|clearInterval()

 

  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155349.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • .net mvc5_mvc工作流程

    .net mvc5_mvc工作流程作者:josh-jw介绍我们可以在web页面用HTML表格元素定义WebGrid显示数据,它以非常简单的方式呈现表格数据,支持自定义格式列,分页,排序,并通过AJAX异步更新。WebGrid主要属性:Source-数据来自哪里。通常情况下,通过controlleraction传递modelDefaultSort-定义如何将数据排序。只要在这里提供列名。RowsPerPage-每页表格显示…

    2022年10月1日
    0
  • 5G融合通信_网关正在获取怎么解决

    5G融合通信_网关正在获取怎么解决随着物联网5G商用步伐的加速和5G网络建设的突飞猛进,2020年无疑成为5G向千行百业拓展落地的关键之年。作为“新基建”的领头羊,5G已凝聚产业链力量,蓄势待发为行业的智能化和数字化转型赋能,为新一轮经济增长提速。GrassRouter作为5G技术在超高清视频传输领域应用的领先代表,于今年推出了最新一代5G高速物联网B4G+5G聚合路由器,可支持构建点对点安全传输链路,支持移动/联通/电信混用,实现多达7条2G/3G/4G/5G/有线传输链路聚合,成为5G应用落地的重点项目之一。5G要全面覆盖还

    2022年10月3日
    0
  • 我的随笔-感慨于博客专家的认证

    没有人是一座孤岛,在技术和程序的世界中,每个人都可以有自己的一片小小空间!

    2022年2月26日
    32
  • vue 对象判断为空_Vue中可用的判断对象是否为空的方法

    vue 对象判断为空_Vue中可用的判断对象是否为空的方法vue有两个方法可用1.JSON.stringify(evtValue)=='{}’2.Object.keys(xxx).length==0js判断对象是否为空对象的几种方法1.将json对象转化为json字符串,再判断该字符串是否为”{}”vardata={};varb=(JSON.stringify(data)==”{}”);alert(b);//true2…

    2022年4月30日
    100
  • 串口服务器调试助手使用教程,如何配置串口服务器及串口调试的六个技巧

    串口服务器调试助手使用教程,如何配置串口服务器及串口调试的六个技巧串口服务器如何配置,很多用户都不清楚。今天,本文总结和阐述了如何配置串口服务器和串口调试的六个技巧:1.如何设置串口服务器的串口属性,比如波特率参数和数值?点击屏幕上的“设备”单元;手动键入“程序设置”;手动选择“程序”,最后手动输入“串口参数”。2.串口服务器怎么配置?首先要熟悉自己的操作环境和应用配置参数(熟悉各个串口的工作模式,熟悉主要参数中包含的网络参数,设备本身的信息内容,打印服务等相关…

    2022年6月3日
    51
  • Python 读取txt、csv、mat数据并载入到数组

    一、txt文件数据载入到数组    这里结合上一篇博文的数据来讲怎么方便的载入.txt文件到一个数组,数据如下所示:1、自己写Python代码实现txt文本数据读取并载入成数组形式(PS:下面给了三种方法,选择理解)#-*-coding:cp936-*-importreimportlinecacheimportnumpyasnpimportosfilename=…

    2022年4月7日
    73

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号