cari

Rumah  >  Soal Jawab  >  teks badan

JavaScript的()()原理是什么

比如

(function(){
    console.log(1);
})()

这里把function包起来的()的用处和原理,和最后的()运行上一个函数,他的原理是什么,为什么会运行上一个函数表达式。还有

+function(){
     console.log(2);    //同时返回NaN
}()
-function(){
    console.log(3);    //同时返回NaN
}()
!function(){
    console.log(4);    //返回true
}()

为什么会返回NaN和true?
为什么只有+-!可以运行,其他的却不行,会报错?
有没有其他办法来运行匿名函数,不用下面的方式,也就是在最后不使用()

(function{...}())()
+function(){...}()
-function(){...}()

来运行匿名函数的方法

巴扎黑巴扎黑2819 hari yang lalu335

membalas semua(8)saya akan balas

  • 黄舟

    黄舟2017-04-10 15:25:58

    (function(){
        console.log(1);
    })()
    

    后面() 表示执行这个函数。

    function(){
        console.log(1);
    }
    

    这是一个函数声明,不能直接执行,js 无法解析。

    function前使用~ ! - +的目的是为了消除函数声明和函数表达式间歧义。

    也就是说 function(){ /* code */ } 这是一个函数声明,如果直接在函数声明后使用 "()" 来调用, js 解析器无法解析,会提示:SyntaxError: unexpected_token 错误。
    关于这个可以参考文章:http://swordair.com/function-and-exclamation-mark/

    返回值的问题。

    +function(){
         console.log(2);    //同时返回NaN
         return;
    }()
    

    你例子等价上述。function return 结果为 undefined,undefined隐式转化为数字,结果为NaN, 所以 +undefined 的结果为NaN,- 等同。!是逻辑操作符,所以undefined隐式转化boolean,结果为false,所以!undefined 的结果就为true

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:25:58

    其实能这样写的原因,是因为javascript的function是第一类对象,即function可以赋值给变量

    function demo(){
        console.log('demo');
    }
    
    demo();  // demo
    

    我们只是在这个变量的后面加上对括号,为什么能执行这个函数呢?因为这个demo指向了一个函数,所以我们是间接的执行了函数

    了解了上面的一点后,我们知道javascript是面向对象的变成语言,但是它也可以实现部分的函数式编程特性。

    举个例子,有两个函数,分别是让两个数相加和求一个数的平方

    function add(a,b){
        return a + b;
    }
    
    function square(x){
        return x * x;
    }
    

    那么我们调用的时候,是这样调用的

    square(add(2,3));
    

    但是呢,这样看着挺不清爽的,利用js 的函数式编程特性,我们可以这么写

    function addToSquare(a,b){
        var x = a + b;
        return function(){
            return x * x;
        }
    }
    
    addToSquare(2,3)();  //25
    

    后面的小括号同样是执行,执行前面的函数返回的一个函数,体现了函数的传递性~函数式编程。

    balas
    0
  • ringa_lee

    ringa_lee2017-04-10 15:25:58

    上面的答案已经很全了,我再补充一点,var a=function(){b=4}();类似于这个样子也是立即执行函数里面的内容,alert(b);这个时候就会弹出4.

    balas
    0
  • PHP中文网

    PHP中文网2017-04-10 15:25:58

    这里已经讨论过这个问题了,http://segmentfault.com/q/1010000000442042

    balas
    0
  • PHP中文网

    PHP中文网2017-04-10 15:25:58

    javascript中使用 ()将函数声明括起来可以使声明变成表达式,在表达式的后面加上()就可以执行。

    balas
    0
  • 迷茫

    迷茫2017-04-10 15:25:58

    http://segmentfault.com/a/1190000000660786

    balas
    0
  • 阿神

    阿神2017-04-10 15:25:58

    前端真的学的好累..一开始不懂我就很不明白()()是什么意思
    说白了,其实就是第一个()return一个function,再用()执行 仅此而已
    还好学了几个月,总算有点头绪了

    balas
    0
  • 迷茫

    迷茫2017-04-10 15:25:58

    (function(){
        // ...
    })();
    1. 第一个括号里面是一个函数表达式

    2. (...)()是使用函数调用运算符来执行一个函数。

    balas
    0
  • Batalbalas