首页 文章

感觉标记在功能之前做了什么?

提问于
浏览
1080
!function () {}();

11 回答

  • 6

    这是我从控制台中发现的更多内容 . 如前所述,感叹号使函数返回一个布尔值 .

    对于后一种语法:

    ( function my_function() {} )()
    

    我们可以这样做:

    (function add_them(a,b) { return a+b;} )(9,4)
    

    像同时的函数定义和调用 .

    Edit:
    现在你会问's the use of '! ' type function definition. Let' s考虑以下事项:

    !function a_would_be_function() { alert("Do some junk but inside a function"); }()
    

    你想要执行一个像上面这样的函数,但没有'!'会产生错误 . 希望我很清楚 .

  • 50

    ! 会否定(反对)任何你期望的结果,即如果你有的话

    var boy = true;
    undefined
    boy
    true
    !boy
    false
    

    当你调用 boy 时,你的结果将是 true ,但是当你在调用 boy 时添加 ! ,即 !boy 时,你的结果将是 false . 换句话说,你的意思是 NotBoy ,但这次它基本上是一个布尔结果,无论是 true 还是 false .

    这与 !function () {}(); 表达式发生的情况相同,仅运行 function () {}(); 将标记错误,但在 function () {}(); 表达式前面添加 ! ,使其与 function () {}(); 相反,它应该返回 true . 示例如下:

    function () {}();
    SyntaxError: function statement requires a name
    !function () {}();
    true
    
  • 5

    它是编写IIFE的另一种方式(立即调用函数表达式) .

    它的另一种写作方式 -

    (function( args ) {})()
    

    与...一样

    !function ( args ) {}();
    
  • 0

    功能:

    function () {}
    

    什么都不返回(或未定义) .

    有时我们想在创建函数时调用函数 . 你可能想尝试这个:

    function () {}()
    

    但它导致 SyntaxError .

    在函数之前使用 ! 运算符使其被视为表达式,因此我们可以调用它:

    !function () {}()
    

    这也将返回与函数返回值相反的布尔值,在本例中为 true ,因为 !undefinedtrue . 如果您希望实际返回值是调用的结果,那么尝试这样做:

    (function () {})()
    
  • 1816

    ! 用于airbnb JavaScript guide上标记的函数调用是很有意义的

    通常在单独的文件(也称为模块)上使用此技术的想法,后来得到连接 . 这里需要注意的是,文件应该通过将新文件放在新行的工具连接起来(这对于大多数concat工具来说无论如何都是常见的行为) . 在这种情况下,使用 ! 将有助于避免错误,如果先前连接的模块错过了尾随分号,但这将提供灵活性,以任何顺序放置它们,不用担心 .

    !function abc(){}()
    !function bca(){}();
    

    将工作相同

    !function abc(){}()
    ;(function bca(){})();
    

    但保存两个字符和任意看起来更好 .

    顺便说一句 +-~void 运算符在调用函数方面具有相同的效果,当然如果你使用某些函数从函数返回它们会有不同的行为 .

    abcval = !function abc(){return true;}() // abcval equals false
    bcaval = +function bca(){return true;}() // bcaval equals 1
    zyxval = -function zyx(){return true;}() // zyxval equals -1
    xyzval = ~function xyz(){return true;}() // your guess?
    

    但是如果你将IIFE模式用于一个文件,一个模块代码分离并使用concat工具进行优化(这使得一行一个文件工作),而不是构造

    !function abc(/*no returns*/) {}()
    +function bca() {/*no returns*/}()
    

    将执行安全的代码,与第一个代码示例相同 .

    这个会抛出错误导致JavaScript ASI无法完成其工作 .

    !function abc(/*no returns*/) {}()
    (function bca() {/*no returns*/})()
    

    关于一元运算符的一个注释,它们会做类似的工作,但仅限于它们不在第一个模块中使用的情况 . 因此,如果您无法完全控制连接顺序,那么它们就不那么安全了 .

    这有效:

    !function abc(/*no returns*/) {}()
    ^function bca() {/*no returns*/}()
    

    这不是:

    ^function abc(/*no returns*/) {}()
    !function bca() {/*no returns*/}()
    
  • 28

    它返回语句是否可以计算为false . 例如:

    !false      // true
    !true       // false
    !isValid()  // is not valid
    

    您可以使用它两次将值强制为布尔值:

    !!1    // true
    !!0    // false
    

    所以,更直接地回答你的问题:

    var myVar = !function(){ return false; }();  // myVar contains true
    

    Edit: 它具有将函数声明更改为函数表达式的副作用 . 例如 . 以下代码无效,因为它被解释为缺少必需标识符(或函数名称)的函数声明:

    function () { return false; }();  // syntax error
    
  • 2

    Its just to save a byte of data when we do javascript minification.

    考虑下面的匿名函数

    function (){}
    

    为了使上述作为自调用函数,我们通常会将上面的代码更改为

    (function (){}())
    

    现在我们添加了两个额外的字符 (,) ,除了在调用函数所需的函数末尾添加 () . 在缩小的过程中,我们通常专注于减小文件大小 . 所以我们也可以把上面的函数写成

    !function (){}()
    

    两者都是自调用函数,我们也保存一个字节 . 而不是2个字符 (,) 我们只使用了一个字符 !

  • 1

    的!符号表示它是一个立即调用的函数表达式 .

    感叹号不会单独调用该功能;你可以把()放在最后:

    !function foo() {}()
    () has higher precedence than ! and instantly calls the function.
    

    ()优先级高于!并立即调用该功能 .

    您还可以像下面这样提到它:

    (function(){})();
    

    的!允许表达式返回true . 这是因为默认情况下所有立即调用的函数表达式都返回undefined,所以,我们留下了! undefined,这是真的 .

  • 341

    让我们节省一些其他字节!

    (() => {})()
    

    例:

    (() => {return "yeah"})()
    
  • 5

    ! 是一个逻辑 NOT 运算符,它是一个布尔运算符,它会反转某些东西 .

    虽然您可以通过在函数之前使用 BANG (!)绕过调用函数的括号,但它仍然会反转返回,这可能不是您想要的 . 与IEFE的情况一样,它将返回undefined,当反转时变为布尔值true .

    相反,如果需要,使用右括号和BANG(!) .

    // I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.
    
    (function(){ return false; }());
    => false
    
    !(function(){ return false; }());
    => true
    
    !!(function(){ return false; }());
    => false
    
    !!!(function(){ return false; }());
    => true
    

    其他有效的运营商......

    +(function(){ return false; }());
    => 0
    
    -(function(){ return false; }());
    => -0
    
    ~(function(){ return false; }());
    => -1
    

    联合运营商......

    +!(function(){ return false; }());
    => 1
    
    -!(function(){ return false; }());
    => -1
    
    !+(function(){ return false; }());
    => true
    
    !-(function(){ return false; }());
    => true
    
    ~!(function(){ return false; }());
    => -2
    
    ~!!(function(){ return false; }());
    => -1
    
    +~(function(){ return false; }());
    +> -1
    
  • 1

    JavaScript语法101.这是 function declaration

    function foo() {}
    

    请注意,没有分号:这只是一个函数 declaration . 您需要一个调用 foo() 来实际运行该函数 .

    现在,当我们添加看似无害的感叹号时: !function foo() {} 将它变成 expression . 它现在是 function expression .

    当然,单独 ! 不会调用该函数,但我们现在可以将 () 放在最后: !function foo() {}() ,其优先级高于 ! 并立即调用该函数 .

    所以作者正在做的是为每个函数表达式保存一个字节;一种更易读的写作方式是:

    (function(){})();
    

    最后, ! 使表达式返回true . 这是因为默认情况下所有IIFE都会返回 undefined ,这会留下 !undefined ,这是 true . 不是特别有用 .

相关问题