昨天一朋友和我聊到JS中的异步和同步, 后来从异步和同步的问题中得出了函数的另一面, 觉得挺不错, 特此分享一下
====
追梦子: 聊天是同步还是异步
小A: 异步
小A: 和你聊还可以和别人聊
追梦子: 那得看怎么聊,
小A: 那你也没法说我错
追梦子: 你要是等另一个人回答后再回,也就是你一句我一句,那就是同步
小A: 可如果我和你聊着同事也在和别人聊
小A: 就是异步
追梦子: 如果你和对方左一句又一句,不按顺序来,那就是异步
追梦子: 我说你错是因为,你都说是异步
追梦子: 没有说什么情况下才是异步
小A: 不是说左一句右一句 不按顺序就是异步
小A: 而应该是在你输入的情况下 我可以去和别人聊天的呀
追梦子: 对,是这个意思
小A: ?
小A: 我说对了
追梦子: 你说的有理,左一句又一句这说的太范了,不算是异步
小A: 嗯
追梦子: 异步就是不去等待
小A: 对
小A: 同步是顺序执行 但会堵塞 异步解决的堵塞 但也会改变顺序
追梦子: 改变顺序是结果产生的,不要把重点放在顺序上
小A: 嗯嗯
追梦子: 在等待的过程中,可以去做别的事,才是异步的本质,或者异步的价值所在
小A: 那回调函数你有什么要说的么
追梦子: 做完某件事,通知你一下
小A: 并且这件事还得最后做
追梦子: 那不是这样说
追梦子: 又不是非得最后执行这个回调函数
小A: 是要最后执行啊
追梦子: 回调就是,你事先告诉某人,你说xx你做完件事通知下我,当他做完的时候就会告诉你,但是他在告诉完你以后还可以去做别的
追梦子: 所以不存在最后执行一说
追梦子: 你说最后执行,那你有例子?
小A: 我找找
小A: 你看这个 他事先输出this will.... 然后执行fn里的 最后进行回调输出this
小A:
追梦子: 哈哈
追梦子: 你看的是表面
追梦子: 回调函数才没有什么先执行后执行
追梦子: 你想什么时候执行什么时候执行
追梦子: 都是你自己来决定的
追梦子: 虽然看似回调函数是最后执行,但这只是它的表像
追梦子: 你那个ajax,回调函数后面也可以执行别的啊
追梦子: 回调函数就是个很简单的东西,不要想复杂了
小A: 我只能看表面
小A: 我就觉得他是最后执行的
追梦子: 把函数作为参数传入到另一个函数中。这个函数就是所谓的回调函数。
追梦子: 就看他写的这句就好了
小A: [强]
追梦子: 其他的都是表面
小A: [白眼]
追梦子: 表面的东西,不同的人就会看成不同的东西
追梦子: 就会产生误解
小A: 好吧
追梦子: 往往他只是说的某一方面,但你却看成是它的一切
追梦子: 就像回调函数
追梦子: 你昨天和我说回调函数,早上路上时想了下关于函数的
小A: 然后呢
追梦子: 发觉以前没意识到一件事,函数有个更重要的
追梦子: 那就是可选择时机
小A: 继续
追梦子: 如果没有这点,异步就不太可能实现
小A: 只要稍微什么一点 我就有点晕 我还是得多看看 多想想
小A: 深入
追梦子: 你想啊。函数是不是可以由你自己决定什么时候去执行
小A: 当然 调用它就执行了
追梦子: 如果没有这点,你说异步还可能吗
追梦子: 如果没有这一点,所有代码就被直接执行了, 也就是只能是同步了
小A: 但是 你只是告诉他什么时候执行 他什么时候执行完你是不知道的 就异步来说
追梦子: 你没理解我的点
小A: 我知道你的意思 咱们可以控制他什么时候去执行 也就实现了异步
追梦子: 这样说也不对, 函数不等于异步, 我的意思是函数是实现异步的基础, 如果没有函数就无法实现异步, 但函数本身并不是异步, 异步的本质是通过多线程来实现的,或者是通过等待时机,以延迟执行来达到目的, 比如JS中的setTimeout, 所以异步不等于函数, 而我说的函数是实现异步的基础就在于, 如果没有函数, 而你又希望在做完某件事再去执行某段代码的话, 那你想想你的代码要么是被直接执行了, 要么是等那件事做完了再去执行另一段代码, 也就是同步的
====
一直以为函数就是代码片段的组合, 然而现在想想函数的作用不仅仅是代码的组合以及重复利用, 另一个目的是可选择执行的时机, 很难想像没有函数的JS会是什么样的, 我想那将会是另一门语言, 另一种的语法
后来想了下, 我当时在聊天时说: "如果你和对方左一句又一句,不按顺序来,那就是异步" 这句其实并没有错, 只是没有表达清楚, 假如你和A两个人聊天, 你先问A了某个问题, 但你并没有等A回复, 而是接着又问A了另一个问题, 那就是异步了