浅谈创建函数的两种方式
我们知道,创建函数有两种方式:
1、函数声明
2、函数表达式
下面就针对这两种方式说说自己的看法。
首先,我们创建示例:
//声明式
function zhao(){}
//表达式
var wede=function(){};
貌似看见过有人使用函数表达式方式创建对象来使用,比如一般情况下是这样写:
var obj={};
但有人却是这样写的:
var wede=function(){};
首先针对这两种写法我们来做一个最简单的比较:
Object.prototype.toString.call(obj); //"[object Object]"
Object.prototype.toString.call(wede); //"[object Function]"
得出的结论就是,他们的类型不同。前者是Object类型;后者是Function类型。
虽然是不同的类型,但他们却都能使用相同的方式添加成员,如:
obj.fname="wede";
wede.fname="wede";
结果:
obj.fname; //"wede"
wede.fname; //"wede"
实际上,从原型链的继承关系来看,函数的原型继承于Object,也许这就是其中的奥秘吧。
但是,因为他们是不同的类型,同样的属性还是有区别的:
obj.fname; //这里的fname属性是属于对象的
wede.fname; //而这里的fname属性是属于函数的
这里也许会有一个疑问:既然函数表达式可以用.添加成员,那函数声明方式能不能这样做呢?
下面我们就来说说函数声明式。
毋庸置疑,它也是Function类型的。
Object.prototype.toString.call(zhao); //"[object Function]"
我们可以像上面那样添加成员:
zhao.fname="wede";
zhao.fname; //"wede"
而且这样也不会有任何问题,同样这时的fname属性也是属于函数的。
之所以上面要强调fname属于函数,除了和上面的属于对象的属性相区别,还有一个重要原因。
我们知道,以函数声明方式创建的函数可以是普通函数,也可以是构造函数。
两者的区别仅仅是有木有this的区别(当然说函数首字母大小写也包括,不过这只是书写规范)。
为了说明this在函数中的作用,来看下面的代码:
function F(){this.kname="kkk"}
function F(){kname="kkk"} //注意,这里没有使用this
我们知道,构造函数中this定义的成员是属于实例的;而我们如果省略了this,那结果会是什么呢?
也许我们已经猜到了,属于全局对象window(不过这也得等到函数执行了以后才会有)。证明如下:
(function F(){kname="kkk"})();
kname; //"kkk"
这会让我们又想到了var关键字。
是的,在函数内部用var来声明局部变量,这样无论是对实例还是全局对象都将是不可见的了。
如:function F(){var kname="kkk"}
现在的kname就完全是一个局部成员了。
哎,讨论了半天又回到了原点。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端