这篇文章主要介绍了 js 函数的多种定义方法与其区别,非常的详细,有需要的小伙伴可以参考下
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
1. 函数声明
- function sum1(n1,n2){
- return n1+n2;
- };
2. 函数表达式,又叫函数字面量
- var sum2=function(n1,n2){
- return n1+n2;
- };
两者的区别:解析器会先读取函数声明,并使其在执行任何代码之前可以访问;而函数表达式则必须等到解析器执行到它所在的代码行才会真正被解释执行。
自执行函数严格来说也叫函数表达式,它主要用于创建一个新的作用域,在此作用域内声明的变量,不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,且立即自动执行。
- (function(n1,n2){
- console.log (n1+n2)
- })(1,3);//4
另外几种自执行函数:
- //可用来传参
- (function(x,y){
- console.log(x+y);
- })(2,3);
- //带返回值
- var sum=(function(x,y){
- return x+y;
- })(2,3);
- console.log(sum);
- ~function(){
- var name='~'
- console.log(name);
- }();
- !function(){
- var name='!'
- console.log(name);
- }();
- ;(function(){
- var name=';'
- console.log(name);
- })();
- -function(){
- var name='-'
- console.log(name);
- }();
- //逗号运算符
- 1,function(){
- var name=',';
- console.log(name);
- }();
- //异或
- 1^function(){
- var name='^';
- console.log(name);
- }();
- //比较运算符
- 1>function(){
- var name='>';
- console.log(name);
- }();
- ~+-!(function(){
- var name='~+-!';
- console.log(name);
- })();
- ~!(function(){
- var name='~!';
- console.log(name);
- })();
- (function(){
- var name='call';
- console.log(name);
- }).call();
- (function(){
- var name='apply';
- console.log(name);
- }).apply();
3. 函数构造法,参数必须加引号
- var sum3=new Function('n1','n2','return n1+n2');
- console.log(sum3(2,3));//5
从技术角度讲,这是一个函数表达式。一般不推荐用这种方法定义函数,因为这种语法会导致解析两次代码(第一次是解析常规 ECMAScript 代码,第二次是解析传入构造函数中的字符串),从而影响性能。
- var name='haoxl';
- function fun(){
- var name='lili';
- return new Function('return name');//不能获取局部变量
- }
- console.log(fun()());//haoxl
Function() 构造函数每次执行时都会解析函数主体,并创建一个新的函数对象,所以当在一个循环或频繁执行的函数中调用 Function() 构造函数效率是非常低的。而函数字面量却不是每次遇到都会重新编译的,用 Function() 构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。
来源: http://www.phperz.com/article/17/0217/266703.html