首页 > 语言 > JavaScript > 正文

深入解析JavaScript中的立即执行函数

2024-05-06 14:57:49
字体:
来源:转载
供稿:网友

它是什么
在 JavaScript 里,每个函数,当被调用时,都会创建一个新的执行上下文。因为在函数里定义的变量和函数是唯一在内部被访问的变量,而不是在外部被访问的变量,当调用函数时,函数提供的上下文提供了一个非常简单的方法创建私有变量。

function makeCounter() {  var i = 0;  return function(){    console.log(++i);  };  }//记住:`counter`和`counter2`都有他们自己的变量 `i`var counter = makeCounter();counter();//1counter();//2var counter2 = makeCounter();counter2();//1counter2();//2i;//ReferenceError: i is not defined(它只存在于makeCounter里)

在许多情况下,你可能并不需要makeWhatever这样的函数返回多次累加值,并且可以只调用一次得到一个单一的值,在其他一些情况里,你甚至不需要明确的知道返回值。

它的核心
现在,无论你定义一个函数像这样function foo(){}或者var foo = function(){},调用时,你都需要在后面加上一对圆括号,像这样foo()。

//向下面这样定义的函数可以通过在函数名后加一对括号进行调用,像这样`foo()`,//因为foo相对于函数表达式`function(){/* code */}`只是一个引用变量var foo = function(){/* code */}//那这可以说明函数表达式可以通过在其后加上一对括号自己调用自己吗?function(){ /* code */}(); //SyntaxError: Unexpected token (

正如你所看到的,这里捕获了一个错误。当圆括号为了调用函数出现在函数后面时,无论在全局环境或者局部环境里遇到了这样的function关键字,默认的,它会将它当作是一个函数声明,而不是函数表达式,如果你不明确的告诉圆括号它是一个表达式,它会将其当作没有名字的函数声明并且抛出一个错误,因为函数声明需要一个名字。

问题1:这里我么可以思考一个问题,我们是不是也可以像这样直接调用函数 var foo = function(){console.log(1)}(),答案是可以的。
问题2:同样的,我们还可以思考一个问题,像这样的函数声明在后面加上圆括号被直接调用,又会出现什么情况呢?请看下面的解答。

函数,圆括号,错误
有趣的是,如果你为一个函数指定一个名字并在它后面放一对圆括号,同样的也会抛出错误,但这次是因为另外一个原因。当圆括号放在一个函数表达式后面指明了这是一个被调用的函数,而圆括号放在一个声明后面便意味着完全的和前面的函数声明分开了,此时圆括号只是一个简单的代表一个括号(用来控制运算优先的括号)。

//然而函数声明语法上是无效的,它仍然是一个声明,紧跟着的圆括号是无效的,因为圆括号里需要包含表达式function foo(){ /* code */ }();//SyntaxError: Unexpected token//现在,你把一个表达式放在圆括号里,没有抛出错误...,但是函数也并没有执行,因为:function foo(){/* code */}(1)//它等同于如下,一个函数声明跟着一个完全没有关系的表达式:function foo(){/* code */}(1);            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选