• 从js小问题看大世界。


    1. 这个姑且叫做分组判断执行(具体我也不知道怎么叫准确)。

      

    1. (a || b || c || d || function(){})()  


    第一次见到这样的代码,确实有点头疼,不过很好,得一些朋友的解答。

    该代码的具体含义为:第一个()里面会有判断,如果a为 true 的话,那么此句代码直接就执行为a(),如果a为false,那么就判断b是否为true,如果b为true,则执行为b().

    如果前面的都不为true,那就是执行最后的默认方法。

    2. js的分号自动组合

    不知道何时看到过这样的代码.

    1. ;(function($){  
    2.     //do somethings  
    3. })(jQuery);  


    在很才一段时间,我不知道为什么在代码的第一行要加一个分号,当然在大多数时候,不加这个分号也不存在问题。自己也就没有去深究过.

    近日一些朋友讨论如下代码,才有机会了解这个分号的作用:

     
    1. //code 1  
    2. var a  = function(){}  
    3. a  
    4. (function(){return 1;})();  
    5.   
    6. //code 2  
    7. var a = function(){}  
    8. a  
    9. (function(){return 1 }())  


    第一段代码执行会提示a not defined

    第二段刚没有问题。

    那么这是为什么呢。其实问题就出在a的后面没有分号

    没有用分号结束符,那么js默认就认为a的下面的语句是同一个语句。第一段代码就会出错。

    那么第二段为什么没有错呢。这是由于分组运算符的原因,将函数包含在分组符的内部,所以这样a 和函数就被分开了。

    为了避免上述第一段代码的错误,我们自己写了一段内库,但是不知道,前面的代码有没有用分号

    所以会在我们自己的代码的最前面加一个分号,这只是一种确保安全的做法。

    3. 声明函数与函数表达式的区别

     
    1. //code1   
    2. foo();  
    3. function foo(){return 1;}  
    4.   
    5. //code2  
    6. var bar  = function foo(){  
    7.     foo();  
    8. }  
    9. foo();  


    执行上述两段打代码, 很快就会有结果。第一段代码没有问题。而第二段则是foo not defined.

    究其原因,第一段中的函数是函数声明。

    js中,js会将函数声明提升,也就是说函数声明会在任何表达式被解析和求值之前被解析和求值。即使你的声明在代码最后一行

    它同样会在同作用域内第一个表达式之前被解析和求值。

    第二段代码之所以会报错也是作用域的问题。函数表达式所确定的作用域中,foo标签会保存到函数的变量对象中。

    而变量对象中的属性是不能用window直接访问的。

    只有活动对象才能够直接用window来访问。而活动对象是由全局对象来创建的。

    也就是说只有当function 为全局对象的时候,才能用标签来访问。

    当采用赋值语句的时间,我们创建的全局对象是bar而不是foo。所以可以用foo来访问对象,但是却不能用foo来访问。

    转自:http://blog.csdn.net/yangzhihello/article/details/20281101

  • 相关阅读:
    git使用命令行方式提交代码到github或gitlab上
    如何创建AnjularJS项目
    基于react-native android的新闻app的开发
    Windows下搭建React Native Android开发环境
    python打怪之路【第一篇】:99乘法表
    python成长之路【第四篇】:装饰器
    python成长之路【第三篇】:函数
    python成长之路【第二篇】:列表和元组
    python成长之路【第一篇】:python简介和入门
    JavaScript进阶--慕课网学习笔记
  • 原文地址:https://www.cnblogs.com/nuoku/p/3577588.html
Copyright © 2020-2023  润新知