您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

Js精简版 [免费源码]

  • 时间:2022-07-10 00:32 编辑: 来源: 阅读:319
  • 扫一扫,手机访问
摘要:Js精简版 [免费源码]
原来JS是这样的——推广。很久没有专门学过JS了。因为之前啃过C++,玩过一段时间的算法竞赛(我写的是好心的意大利面),所以我在折腾自己的网站的时候总是把JS写成C。 但是写的时候总会遇到几个奇怪的问题,所以我打算花点时间读读你不知道的JavaScript。 写这篇文章是为了记录一段时间的学习内容,也是为了治愈自己不喜欢做笔记和总结的毛病。 如果你一直按照其他语言的编程习惯来写JS,但是还没有具体理解,那就来了解几个JS独有的特性吧。 我们先来看一段代码:console . log(" first,I = "+I ");你可以注意到这段代码在开始的时候会输出I的值,但是在输出之前我们似乎没有写任何声明和语句来定义I的值。之后我们给I赋了一个值,但还是没有用var这样的关键字来公布变量。 在for循环中,我们终于公布了I,但是在for循环之后,我们仍然在尝试使用I。 这些代码看起来都很可笑,或者也许你可以认为这段代码会在第一行报告ReferenceError,提醒我们变量I没有定义,并停止执行。 但事实真的是这样吗?我们来看看这段代码的执行结果:首先,i = undefined。这段代码其实很谭浩强,但它说明了JS的一个显著区别,那就是推广和使用领域规则。 吊装或者也许是因为以前编程语言中获得的经验,我们可能会认为只能在公告语句后使用刚刚公告的变量。我们来看这个代码:a = 61你可以认为第一条语句是违法的,但实际上是正常执行的,但很明显我们只是在下面公布了一条,这就是推广的意思。 实际上,当JavaScript解释一个域中的代码时,它会在执行该域中的任何代码之前解析变量和函数的声明。 这就像把函数和变量的声明带到了这个应用程序域的顶端。 这个过程被称为提升。 所以我们来看下一段代码:console . log(a);//未定义的停止!等等!不会升职吗?不应该是log 61吗?但事实上,答案是未定义的 其实我们可以理解为,编译器分析这段代码的时候,这段代码的第二行被编译器解析成两部分,var a和a = 61。 就像刚才说的,公告确实需要提升,所以var a“被顶”了,而a = 61则原地踏步。因此,这段代码实际上会输出一个undefined,而不是我们不知道术语promotion时可以猜测的结果ReferenceError,以及我们认为也会促进赋值的61。 如上所述,功能的公布也将得到促进。如果你在定义一个函数之前试图使用它,但是没有错误,这就是为什么你可以在页面底部引入外部js代码,并且你仍然可以使用这些代码。 当然也有几个需要注意的地方。函数表达式的提升规则比较奇怪,比如下面的代码。 foo();// TypeError大致会这样解释:var foo如果不知道函数宣告和函数表达式的区别,请参考这个和这个。 使用范围。当你知道提升的概念后,如果你依次看最上面的示例代码,你可能还是会觉得不正常——我们在for循环的代码块中明确公布了变量。为什么可以在外面用?你刚才不是说代码只提升到一个应用域的顶端吗?所以我们来看下面这段代码://console . log(bar);最直观的印象,这段代码会在函数foo中的一个条件语句成立的情况下,宣告变量bar并赋值61。事实上,我们会发现,除了我们在函数中注释掉的语句之外,我们都可以访问该栏。 你刚才不是说晋升仅限于工作范围吗?没错,确实如此,但实际上JavaScript的操作域本身并没有解决这样的问题。if、for等后面由花括号组成的块。被用作操作域。 所以这里公布的bar的实际操作域是在函数foo内部,而不是由if组成的块级操作域。 但是,需要注意的是,with和try/catch可以创建自己单独的应用程序域。 当然,其实ES6引入的新关键字let解决了这个问题,let公布的变量只存在于块级使用域,解决了var带来的名字污染问题。 所以让我们回到最初的例子。我们看似只在for循环中公布的变量,实际上是提升到了for循环之外的操作范围,所以剩下的内容没有什么不合理的。 额外的一点是,对于已经公布的变量,再次公布同名变量的行为将被忽略。 闭包(Closure)根据刚才提到的内容,看下面的代码函数foo(){很明显,我们在foo中公布的变量T的操作域就是foo函数本身,我们无法从外部访问foo,但实际上我们随时都可以需要访问foo的操作域中被封闭的变量T。因此,为了能够访问这个变量,我们让foo返回bar来访问t变量,并使用baz来 所以当我们执行baz()时,会看到t的值被输出,t的值会加1。 实际上,我们使用baz是为了防止bar的操作域被引擎回收,所以我们保留了这个操作域中的变量,以备将来重用,我们也可以从外部访问它(这个要求就像面向对象语言中类对象中的私有成员一样)。 我们所做的实际上叫做终结。 为了不混淆,我们再来说一下闭包的概念:当一个函数能够记住并访问它的词法域时,就产生了闭包,即使这个函数是在当前的词法域之外执行的。 我们来看下面的代码var a = 61这是一个如上的立即执行函数(IIFE)吗?这是一个闭包吗?回答:没有。 因为函数本身并不是在它外面的词法域中执行的,所以其中使用的变量A并不是函数IIFE封闭的变量。 所以,这不是一个终结。 考虑以下代码(var I = 1;在这段代码中,我们将直接执行函数放入for循环中,IIFE中的内容是延迟I秒后输出I的值。 看起来应该是输出1到5,每秒1个,实际是66666(每秒1个6)。 其实和前面的代码一样,这个立即执行函数和这段代码中的没有什么不同,使用的I仍然是外部操作域的I(而不是life组成的操作域中的内部变量)。 所以因为函数的执行被延迟了,所以for循环在执行的时候就已经结束了,自然输出66666。 而如果想达到自己的目的,只需要这样修改:for(var I = 1;I看起来是一个很痛苦的把戏,但是我们通过参数传入的I已经成为了life中一个隐式公布的变量J,J的工作范围在life形成的语法工作范围之内,自然不会有问题。 最后简单提一下板块机制。 回到闭包段落的第一个例子,我们可以看到,我们可以通过返回一个可以访问闭包内部变量的函数来访问闭包内部的变量(听起来很扯淡)。当我们在写一个节的时候,我们通常需要通过这个行为来模拟一个类。实现这种行为的方法有很多。比如:function moduleFoo() {// ps:以函数表达式的形式公布这个函数,可以达到singleton的效果。其实更多板块机制的实现可以单独开发一篇文章,这里就不细说了。需要提到的是,ES6引入了import关键字来引入和使用单个文件作为板块。 当然,这超出了刚才讨论的闭包的范围。 蛤蜊!


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部