javascript - js中的函数和函数对象是不是指的同一个东西?

查看:110
本文介绍了javascript - js中的函数和函数对象是不是指的同一个东西?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

function a(){
    console.log('123');
}

function b(){
    this.name = 'test';
}

var test = new Funciton('return 1');

上面这是那种形式,a,b,test那个是函数,那个是函数对象,我有点被概念迷惑了

解决方案

这个是概念性的问题。不过函数的内容很多,我只能说一些。

函数在JS中是对象(物件),但它与一般的物件不同。而且js中的面向对象(物件导向)并不是以类(class)为基础的,而是以原型(prototype)为基础的,一开始用会觉得很怪异。

先看这代码,是Function而不是Funciton,应该是打错字:

var test = new Function('return 1');

//这里观察test与它的类型
console.log(test);
console.log(typeof test)

特别注意: 此例new Function()的函数定义语法,建议学习理论可以但实践中别用。

这代码会建立一个匿名函数,指定给test变量,而且test的类型是"function"。为何不是"object"?因为js中认为函数是个特别的对象(物件),应该要有自己的类型,所以给函数自己独立的类型,这有个名词叫"头等函数",意思是函数在js中是头等公民,地位很高,所以又有另一个名词叫高阶函数,你可以去科普一下百科上有,这是js中的设计便是。

当然,实际上js中,所有的资料类型都是对象,一般认为原始资料类型(数字、字串…)应该不是之外,但实际上原始资料类型都有对应的包装对象,其他的例如数组(阵列),都算是直接的对象类型,总的来说函数算是特别的对象类型,所有的函数在js中都可说是一个函数对象(物件)。


回到问题中第一例:

function a(){
    console.log('123');
}

这是最常见的函数定义语法,这语法通常称为函数宣告方式(FD, Function Declaration),另一种也很常见的是函数表述式方式(FE, Function Expression),像下面这样的语法:

var a = function(){
    console.log('123');
}

FD与FE有一些差异,这个内容就需要作功课了,不是三言两语说得尽。此外还有最新的"箭头函数",也是另一种函数的定义语法。不论是用FD与FE或"箭头函数",都是在定义出函数的执行内容,也就是函数物件的函数主体。

问题中第二例:

function b(){
    this.name = 'test';
}

第二例与第一例的差异,在于用了this这个关键字,这是看起来是面向对象(物件导向)的样子。实际上这是建构式函数的定义方式,建构式函数是用来建立物件时使用的函数,如果你有学过面向对象就有点概念。在js中的设计,它把建构式(contructor)特性隐含在函数之中,这是原型面向对象(物件导向)的设计。这是因为js中原来并没有如类(class)的东西,那要如何作面向对象的设计?例如从一个规划好的对象产生新的对象?js中靠的是函数,对于有学过以类(class)为基础的面向对象的开发者来说十分怪异。因为这范围内容太多,在此就不多讲了。

你可以参考我写的一篇`原型基础物件导向(面向对象)"(繁体): https://eyesofkids.gitbooks.i...

这篇关于javascript - js中的函数和函数对象是不是指的同一个东西?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆