zoukankan      html  css  js  c++  java
  • function与感叹号

    通常,我们调用一个方法的方式就是 FunctionName()

    但是,如果我们尝试为一个“定义函数”末尾加上(),解析器是无法理解的。

    function msg(){
      alert('xxx');
    }();//解析器是无法理解的

    定义函数的调用方式应该是 msg() ; 那为什么将函数体部分用()包裹起来就可以了呢?

    原来,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数。也就是说,任何能将函数变成一个函数表达式的作法,都可以使解析器正确的调用定义函数。而 ! 就是其中一个,而 + - || 都有这样的功能。

    任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别。比如:

    var i = function(){return 10}();        // undefined  
    1 && function(){return true}();        // true  
    1, function(){alert('xxx')}();        // undefined 

    赋值,逻辑,甚至是逗号,各种操作符都可以告诉解析器,这个不是函数声明,它是个函数表达式。并且,对函数一元运算可以算的上是消除歧义最快的方式,感叹号只是其中之一,如果不在乎返回值,这些一元运算都是有效的:

    !function(){alert('xxx')}()        // true
    +function(){alert('xxx')}()        // NaN
    -function(){alert('xxx')}()        // NaN
    ~function(){alert('xxx')}()        // -1

    甚至下面这些关键字,都能很好的工作:

    void function(){alert('xxx')}()        // undefined  
    new function(){alert('xxx')}()        // Object  
    delete function(){alert('xxx')}()        // true 

    最后,括号做的事情也是一样的,消除歧义才是它真正的工作,而不是把函数作为一个整体,所以无论括号括在声明上还是把整个函数都括在里面,都是合法的:

    (function(){alert('xxx')})()        // undefined
    (function(){alert('xxx')}())        // undefined

    说了这么多,实则在说的一些都是最为基础的概念——语句,表达式,表达式语句,这些概念如同指针与指针变量一样容易产生混淆。虽然这种混淆对编程无表征影响,但却是一块绊脚石随时可能因为它而头破血流。

  • 相关阅读:
    java Des 加密解密技术
    JAVA处理外部链接的方法
    javascript 中escape、encodeURI、encodeURIComponent 区别
    JQuery与JS 遍历和操作 父页面控件的比较
    JS 添加删除元素 /DOM
    jquery 验证所有text,textare非法字符
    jquery url检测遇到的jquery跨域问题及JSONP的使用
    二叉树遍历非递归算法——后序遍历
    二叉树遍历非递归算法——中序遍历
    二叉树遍历非递归算法——先序遍历
  • 原文地址:https://www.cnblogs.com/frontendBY/p/5264347.html
Copyright © 2011-2022 走看看