• 从js小问题看大世界。


    整理一下在近日所学到一些比较杂的东西。

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

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

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

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

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


    2. js的分号自动组合

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

    ;(function($){
        //do somethings
    })(jQuery);

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

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

    //code 1
    var a  = function(){}
    a
    (function(){return 1;})();
    
    //code 2
    var a = function(){}
    a
    (function(){return 1 }())

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

    第二段刚没有问题。

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

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

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

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

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

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

    //code1 
    foo();
    function foo(){return 1;}
    
    //code2
    var bar  = function foo(){
        foo();
    }
    foo();
    

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

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

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

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


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

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

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

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

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


  • 相关阅读:
    SQL的Demo 由Access改为SQLite
    Delphi10.3ComboBoxEx下拉左边带图标
    uniGUI学习之IconCombobox(53)
    MySQL的图形GUI界面Navicat操作(03)
    delphi10.3安装使用mySQL(02)从SQLite 转移至Mysql
    [转] Java虚拟机原理图解 系列
    [转]ASM插入代码 visitFieldInsn
    [转]大话+图说:Java字节码指令——只为让你懂
    [转]smali语言之locals和registers的区别
    [转]Smali浅析及dex,java互转
  • 原文地址:https://www.cnblogs.com/yangzhi/p/3576508.html
Copyright © 2020-2023  润新知