扫码关注官方订阅号
如下图,看到好多人写function的时候,都用var aa=function(){}的形式,这是为什么呢?是性能可以提升一些吗?求指教~
光阴似箭催人老,日月如移越少年。
这两种是有区别的,一种是函数声明,一种是函数表达式。函数声明:
funName()//正常执行 function funName(){ //code }
函数表达式:
funName()//报错 var funName=function(){ //code }
解析器在向执行环境加载数据时,对这两种是有区别的,解析器会率先读取函数声明,以确保在执行任何代码之前可以访问,而函数表达式,则必须等到解析器执行到他所在的代码才会被真正执行。另外除了这一点区别,函数声明与函数表达式的语法其实是等价的。至于使用哪种就看题主自身的情况来决定,比如:
if(flag){ function sayHi(){ alert("Hi"); } }else{ function sayHi(){ alert("Yo"); } }
上面代码希望,在flag为true的时候,调用sayHi时弹出Hi,而false时则弹出Yo,但实际上这在javascript中属于无效代码,大多浏览器会使用第二个函数声明,忽略flag。可以使用以下写法:
var sayHi if(flag){ sayHi=function(){ alert("Hi"); } }else{ sayHi=function(){ alert("Yo"); } }
这种写法就不会有什么意外,根据flag的不同,sayHi所弹出的内容也会出现变化。
匿名函数更多的时候是以回调的身份出现的. 而如果有确定的功能, 用普通函数就行了
函数申明
//这种方式 函数作为一等公民会提升 var a = bb(1) //正常执行,输出1 function bb(val){ console.log(val) }
//这种就不会啦 var c = dd(1) //ERR:dd is not a function var dd = function(val){ console.log(val) }
不觉得,我喜欢用后者
没有好坏之分,唯一的区别就是,声明函数会优先解析,而函数表达式是执行到才解析,你的代码改变一下:aa()var aa = function(){};就是错的,但如果是aa();function aa(){}就是对的
后者会有函数提升的现象,而函数表达式就没有这种情况,不过我有时候喜欢用函数表达式。
想不出第一种为什么会有性能提升。如果函数不用于返回或作为参数,应该很少人会使用第一种方式吧。
在全局作用域或者函数作用域下推荐第二种写法。在块级作用域,例如if/else语句中,尽量使用第一种表达式写法。。
var functionname = function (){ …… };
js中存在变量提升,但是初始化的内容不会提升。就像上面这个,functionname在作用域一开始只声明,不初始化,如果用到了functionname 但还没到这句,那么functionname就是一个undefined
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
这两种是有区别的,一种是函数声明,一种是函数表达式。
函数声明:
函数表达式:
解析器在向执行环境加载数据时,对这两种是有区别的,解析器会率先读取函数声明,以确保在执行任何代码之前可以访问,而函数表达式,则必须等到解析器执行到他所在的代码才会被真正执行。
另外除了这一点区别,函数声明与函数表达式的语法其实是等价的。
至于使用哪种就看题主自身的情况来决定,比如:
上面代码希望,在flag为true的时候,调用sayHi时弹出Hi,而false时则弹出Yo,但实际上这在javascript中属于无效代码,大多浏览器会使用第二个函数声明,忽略flag。
可以使用以下写法:
这种写法就不会有什么意外,根据flag的不同,sayHi所弹出的内容也会出现变化。
匿名函数更多的时候是以回调的身份出现的. 而如果有确定的功能, 用普通函数就行了
函数申明
不觉得,我喜欢用后者
没有好坏之分,唯一的区别就是,声明函数会优先解析,而函数表达式是执行到才解析,你的代码改变一下:
aa()
var aa = function(){};
就是错的,但如果是
aa();
function aa(){}
就是对的
后者会有函数提升的现象,而函数表达式就没有这种情况,不过我有时候喜欢用函数表达式。
想不出第一种为什么会有性能提升。如果函数不用于返回或作为参数,应该很少人会使用第一种方式吧。
在全局作用域或者函数作用域下推荐第二种写法。在块级作用域,例如if/else语句中,尽量使用第一种表达式写法。。
js中存在变量提升,但是初始化的内容不会提升。就像上面这个,functionname在作用域一开始只声明,不初始化,如果用到了functionname 但还没到这句,那么functionname就是一个undefined