发布于 1970-01-01 08:00
  • 2 个回答
    • 所有的函数都是对象,js中所有的引用类型值都是对象

      2022-11-26 21:06 回答
    • 这个是概念性的问题。不过函数的内容很多,我只能说一些。

      函数在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...

      2022-11-26 21:06 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有