JavaScript不同函数声明类型解析:两种写法的差异是什么?
JavaScript两种函数声明方式的差异解析
嘿,咱们来好好拆解一下你提到的这两种JavaScript函数写法的核心差异——其实本质上它们都属于函数表达式,但在应用场景、特性和使用方式上有不少区别:
1. 带变量名的函数表达式(var x = function (a, b) {return a * b};)
- 这是最基础的匿名函数表达式:函数本身没有自带的名称,只是把它赋值给了变量
x。如果需要在函数内部递归调用自己,得给它加个名字,比如var x = function fn(a,b){ if(a<=1) return 1; return a*fn(a-1); },这样内部就能用fn()递归了 - 作用域规则:变量
x的作用域完全取决于它的声明位置——在全局作用域声明就是全局可用,在某个函数内部声明就只能在该函数里访问 - 调用限制:只能通过变量名
x()调用;而且由于变量声明提升但赋值不提升的特性,在var x = ...这行代码之前调用x()会得到undefined,因为此时x只是被声明了,还没被赋值为那个函数
2. AngularJS 1中的对象方法定义
这种写法是把函数作为对象字面量的属性值,本质上是对象的方法,比如你例子里的:
var method = { add_category: function(data, success, failure) { $upload.upload({ url: baseUrl() + 'add_category', data: data }).success(success).error(failure); }, fileupload: function(data, success, failure) { $upload.upload({ url: baseUrl() + 'ImageUpload', data: data }).success(success).error(failure); } } return method;
它的特性和第一种有明显区别:
- 上下文(
this指向):当通过method.add_category()调用时,函数内部的this默认指向method这个对象;但如果把方法单独提取出来(比如var addCat = method.add_category),再调用addCat()的话,this就会指向全局对象(严格模式下是undefined) - 代码组织性:这种写法非常适合模块化打包相关功能——就像例子里把所有和文件上传、分类添加的操作都放在
method对象里,既避免了全局变量污染,也让相关功能更集中,维护起来更方便 - 调用方式:必须通过对象的属性访问调用,比如
method.fileupload(...);同样遵循变量提升规则,在method对象声明完成之前调用它的方法会报错
总结
简单来说,第一种是独立的单功能函数表达式,适合定义单个独立的函数;第二种是把函数作为对象方法,侧重于将相关功能模块化组织,同时在this指向和代码结构上有独特的优势。
内容的提问来源于stack exchange,提问作者Bala venkatesh
相关产品推荐
相关产品推荐

