• 块级作用域和函数的自我执行


    看了好多地方讲这两个东西,我一直以为不一样,后来仔细体会发现这两个其实是一样的,没有什么不同。只是使用的位置不同。

    函数的自执行:

    -----------------------------------------------------------------------------------------

    // 下面2个括弧()都会立即执行
    (function () { /* code */ } ()); // 推荐使用这个
    (function () { /* code */ })(); // 但是这个也是可以用的

    ---------------------------------------------------------------------------------

    关于前面加!等的作用:

    // 由于括弧()和JS的&&,异或,逗号等操作符是在函数表达式和函数声明上消除歧义的
    // 所以一旦解析器知道其中一个已经是表达式了,其它的也都默认为表达式了

    var i = function () { return 10; } ();
    true && function () { /* code */ } ();
    0, function () { /* code */ } ();

    // 如果你不在意返回值,或者不怕难以阅读
    // 你甚至可以在function前面加一元操作符号

    !function () { /* code */ } ();
    ~function () { /* code */ } ();
    -function () { /* code */ } ();
    +function () { /* code */ } ();

    一元运算符表示他是一个表达式而不是函数声明。

    void 比!写的多,好像速度快一点。

    块级作用域还有一个功能是传参。改变他本地的显示形式。

    ------------------------------------------------------------------------------

    函数的自我执行,一般情况下,习惯在前边加一个!之后的,特别在一个整体的js文件开始的时候,块级使用在js函数的里边,一般前面都没有,

    函数声明的方式,两次用的差别不大,但是在函数表达式的时候差别就有点大。

    如果用自我执行的话。
    var box=(function(){return 'hello'})()
    如果用块级作用域的话
    var box=(function(){
    function (){return 'hello';}
    })()
    这里的块级作用域直接报错了,所以不能这样写。不能一个匿名函数的自我执行。如果不是匿名函数就可以了。

    块级作用域不能赋值给一个对象中,有的模块js代码,习惯在块级作用域前加!,表示块级作用域不是一个表达式。

     =====================================

    后来补充:

    发现并不是块级作用域在哪里都行的,可能因为水平太次了,

    在事件中,在onresize,在h5的横竖屏转换的逻辑中,如果你想通过块级作用域,区分每次的self是不行的。

    即使你的self经过了浅拷贝也不行的,$.extend({},self);

     ========================================

    有时间看看这个:

     ===========================

  • 相关阅读:
    luogu 2742 二维凸包
    poj2398 Toy Storage 计算几何,叉积,二分
    luoguP1742 最小圆覆盖
    bzoj4501 旅行
    cf1173 D. Nauuo and Circle
    bzoj3745: [Coci2015]Norma 分治,单调队列
    bzoj1176: [Balkan2007]Mokia cdq
    luoguP3964 [TJOI2013]松鼠聚会
    浅谈数学期望
    tarjan模板(带注释)
  • 原文地址:https://www.cnblogs.com/coding4/p/5445961.html
Copyright © 2020-2023  润新知