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(){...}()

来运行匿名函数的方法

阅读 10.2k
8 个回答
(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

其实能这样写的原因,是因为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

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

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

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

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

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

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

推荐问题
宣传栏