JS 立即执行的函数表达式(function)写法

解释了如何在JavaScript中创建并立即执行函数表达式,提供了两种实现方式,并讨论了它们的区别和优缺点。

1. 前言

函数需要先定义,后使用。 这基本上所有编程语言的一条铁的定律。

一般状况下, 我们需要调用一个JavaScript 函数, 基本的状况都是先定义, 然后再调用。 看一个例子

[html]  view plain copy
  1. <!--by oscar999 2013-1-16-->  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  3. <html>  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  6. <title>Say Hello</title>  
  7. </head>  
  8. <body>  
  9. <script>  
  10.     //define function  
  11.     function sayHello()  
  12.     {  
  13.         alert("hello");  
  14.     }  
  15.     //call function  
  16.     sayHello();  
  17. </script>  
  18. </body>  
  19. </html>  

但是如果不需要显示调用函数, 让这个函数在定义的时候就执行的话, 该如何写才可以呢?

[html]  view plain copy
  1.   

2. 思考的历程

从以上的例子来看,聪明的你结合以上的使用状况可能会想:
===》既然调用的时候是在函数名后面加上一对 是否在function 定义的后面加上一对大括号是否就可以执行了呢? 像以下这样:
[javascript]  view plain copy
  1. function sayHello()  
  2. {  
  3.     alert("hello");  
  4. }();  

不幸的是,以上的写法会报出js 的语法错误。
因为Javascript 的解析器在解析器解析全局的function或者function内部function关键字的时候, 默认会把大括号解析成function声明,而不是function表达式。
也就是说, 会把最后的一对大括号默认解析成一个缺少名字的function,并且抛出一个语法错误信息,因为function声明需要一个名字。

===》 你可能又会想, 如果我在大括号中传入参数是否就会解析成表达式了呢?

[javascript]  view plain copy
  1. function sayHello()  
  2. {  
  3.     alert("hello");  
  4. }(1);  
的确, 错误是没有了。 但是以上的写法等同于以下写法的效果
[javascript]  view plain copy
  1. function sayHello()  
  2. {  
  3.     alert("hello");  
  4. };  
  5. (1);  
这两句完全没有关系, 函数还是不会执行


3. 正确的写法


对于JavaScript 来说,括弧()里面不能包含语句,所以在这一点上,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function声明 

所以, 只要将大括号将代码(包括函数部分和在后面加上一对大括号)全部括起来就可以了。

[javascript]  view plain copy
  1. (function sayHello()  
  2. {  
  3.     alert("hello");  
  4. }());  

还有一种写法也可以, 就是将后面的大括号移出来, as

[javascript]  view plain copy
  1. (function sayHello()  
  2. {  
  3.     alert("hello");  
  4. })();  

推荐是使用第一种方式。

但是目前很多比较好的js library 使用的都是第二种方式。

比如: web 图形绘制的: git , draw2d ,....


 4. 参考


1.  http://benalman.com/news/2010/11/immediately-invoked-function-expression/

ps:就是预加载方法(funciton funName(){}())
<think>嗯,用户想了解JavaScript函数表达式的正确写法。首先,我需要回忆一下函数表达式的基本概念,以及和函数声明的区别。根据引用[1],函数表达式是在表达式或语法结构中创建的,比如赋值语句的右侧。例如,`let sum = function(a, b) { return a + b; };`。这点很重要,用户可能需要区分函数表达式和函数声明的不同使用场景。 接下来,用户可能遇到的常见错误是什么?比如引用[2]提到的语法错误,如`SyntaxError: expected expression, got ';'`或者`SyntaxError: expected expression, got 'if'`,这可能是因为在需要表达式的地方错误地使用了语句。例如,在赋值时使用了if语句,而应该使用函数表达式或者其他表达式。 然后,引用[3]强调了JavaScript中表达式和语句的区别。表达式会返回一个值,而语句执行动作。因此,在需要值的地方,比如函数参数或变量赋值,必须使用表达式。函数表达式作为表达式,可以出现在这些位置,而函数声明则不能。 另外,引用[4]提到jQuery选择器中的语法错误,可能与表达式解析有关。虽然用户的问题是关于函数表达式的,但可能需要提醒注意语法正确性,比如正确的括号和符号使用,避免因为拼写错误导致的语法问题。 现在需要整理函数表达式的正确写法。基本结构是使用`function`关键字,但不像声明那样有函数名(匿名函数),或者可以有命名函数表达式。比如: 匿名函数表达式:`const add = function(a, b) { return a + b; };` 命名函数表达式:`const factorial = function calc(n) { ... };`,这里calc只在函数内部可见,有助于调试。 箭头函数作为函数表达式的一种,更简洁:`const multiply = (a, b) => a * b;` 常见错误点可能包括缺少分号,错误使用函数声明语法在需要表达式的地方,比如在对象字面量中错误地使用函数声明。例如: 错误写法:`const obj = { method: function method() { ... } };` 这里应该是函数表达式,但语法是否正确?其实这样写是对的,但用户可能混淆声明和表达式的位置。 另外,立即执行函数表达式(IIFE)的正确写法:`(function() { ... })();`,这里需要用括号包裹函数体,使其成为表达式,否则解析器会认为是函数声明而报错。 可能还需要提到函数表达式的作用域和提升,函数表达式不会被提升,而函数声明会。因此,函数表达式必须在定义后使用。 最后,总结正确写法,常见错误示例及解决方法,帮助用户避免典型的语法错误,比如分号问题,错误使用关键字等。</think>### JavaScript函数表达式语法规范 #### 一、基本语法结构 函数表达式的核心特征是*作为值存在*,其标准语法为: ```javascript // 匿名函数表达式 const add = function(a, b) { return a + b; }; // 命名函数表达式 const factorial = function calc(n) { return n <= 1 ? 1 : n * calc(n-1); }; ``` 命名函数表达式中的函数名(如`calc`)仅在函数内部可见,外部无法访问[^1]。 #### 二、箭头函数表达式(ES6+) 现代JavaScript支持更简洁的写法: ```javascript const multiply = (a, b) => a * b; const logMessage = msg => console.log(msg); ``` #### 三、常见错误示例 1. **语句位置错误** ```javascript // 错误:在需要表达式的位置使用函数声明 if (true) function foo() {} // SyntaxError // 正确写法 if (true) { const foo = function() {}; } ``` 2. **立即执行函数格式错误** ```javascript // 错误:缺少包裹括号 function(){ console.log('IIFE') }(); // SyntaxError // 正确写法 (function() { console.log('IIFE'); })(); ``` 3. **符号缺失错误** ```javascript // 错误:缺少分号导致后续括号被解析为函数参数 const fn = function(){} (function(){})() // 被解析为 fn()(function(){})() // 正确写法 const fn = function(){}; (function(){})(); ``` #### 四、最佳实践 1. 优先使用箭头函数简化代码 2. 需要函数自引用时使用命名函数表达式 3. 避免在逻辑判断中直接定义函数表达式 4. 使用ESLint进行语法检查(可检测99%的语法错误)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值