标签:
function f(){alert("fff")}(1)
//1
function strict()
{
// 函数级别严格模式语法
‘use strict‘;
function nested() { return "And so am I!"; }
return "Hi! I‘m a strict mode function! " + nested();
}
function notStrict() { return "I‘m not strict."; }
void function(){alert(2)} //undefined
void function(){alert(2)}(); 可以调用
new function(){alert(2)}();可以调用
new function(){alert(2)}; 这里后面没跟括号,也可以调用。
具体原因,在慢慢研究!!留个mark!
var nextId = function() { var id = 1 return function() { return id++ } },调用方式nextId();
有些函数通常只会执行一次,比如进行初始化之类的工作。没必要浪费时间为它起一个可以复用的函数名
var dd=function() {
alert("hello, world.");
} (); 在表达式后面加括号,可以调用
function foo(){}
或者var foo = function(){}
,调用时,你都需要在后面加上一对圆括号,像这样foo()
。()
之间只能包含表达式(expression)由于把函数的声明写在了()
之中,所以解释器以表达式(expression)来解析其中代码foo相对于函数表达式`function(){/* code */}`只是一个引用变量
var foo = function(){/* code */}
function(){ /* code */}(); //SyntaxError: Unexpected token (
遇到了这样的function关键字,默认的,它会将它当作是一个函数声明,而不是函数表达式,如果你不明确的告诉圆括号它是一个表达式,
它会将其当作没有名字的函数声明并且抛出一个错误,因为函数声明需要一个名字。
var foo = function(){console.log(1)}(),答案是可以的。
//然而函数声明语法上是无效的,它仍然是一个声明,紧跟着的圆括号是无效的,因为圆括号里需要包含表达式。
如果想要直接调用匿名函数,需要让js把它按照表达式来解析
function foo(){ /* code */ }();//SyntaxError: Unexpected token
//现在,你把一个表达式放在圆括号里,没有抛出错误...,但是函数也并没有执行,因为:
function foo(){/* code */}(1)
//它等同于如下,一个函数声明跟着一个完全没有关系的表达式:
function foo(){/* code */}
(1);
当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明.
(function(){/* code */}());//Crockford recommends this one,括号内的表达式代表函数立即调用表达式
(function(){/* code */})();//But this one works just as well,括号内的表达式代表函数表达式
new function(){ alert("gg") } 会调用
()
之中只是其中的一种方法// 如果本身就是expression,那么根本不需要做任何处理 var i = function(){ return 10; }(); true && function(){ /* code */ }(); 0, function(){ /* code */ }(); // 如果你不在乎返回值,可以这么做 !function(){ /* code */ }(); ~function(){ /* code */ }(); -function(){ /* code */ }(); +function(){ /* code */ }();
当圆括号出现在匿名函数的末尾想要调用函数时,它会默认将函数当成是函数声明。
当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明。
标签:
原文地址:http://www.cnblogs.com/nostic/p/5769019.html