JS 的函数和方法区别在哪里? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
misakawaque
V2EX    Javascript

JS 的函数和方法区别在哪里?

  •  1
     
  •   misakawaque 2021-03-01 21:54:22 +08:00 4655 次点击
    这是一个创建于 1684 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想花 3 天速览一下 js 所以用的菜鸟 看到函数的第三部分有点疑惑

    百度的搜索结果看起来像乱码.......

    36 条回复    2021-03-02 16:53:15 +08:00
    hkingstu
        1
    hkingstu  
       2021-03-01 22:07:28 +08:00 via iPhone
    没区别
    renmu123
        2
    renmu123  
       2021-03-01 22:10:51 +08:00 via Android
    我也觉得在 js 中方法和函数没什么区别,在别的语言中,函数就是 function,而方法( method )是在类中,js 中这两者分得没那么清楚。
    参考: https://stackoverflow.com/questions/155609/whats-the-difference-between-a-method-and-a-function
    参考: https://segmentfault.com/q/1010000000420497
    ps:学习编程千万不能用百度
    misakawaque
        3
    misakawaque  
    OP
       2021-03-01 22:10:54 +08:00
    @hkingstu 菜鸟里有这么一句话:"在 Javascript 中, 函数是对象。Javascript 函数有它的属性和方法。"
    这个怎么理解啊
    smallyu
        4
    smallyu  
       2021-03-01 22:10:58 +08:00
    区别就是函数和方法的区别
    misakawaque
        5
    misakawaque  
    OP
       2021-03-01 22:12:46 +08:00
    @renmu123 那有没有什么比较快的速览 js 的教程或者方法啊
    面向对象和函数式都有基础所以想要简便的方法去学习
    Austaras
        6
    Austaras  
       2021-03-01 22:12:47 +08:00
    @misakawaque
    ```
    function foo() {
    console.log(this.a)
    }

    foo.call({ a: 123 })
    ```
    这个 call 就是函数的方法
    across
        7
    across  
       2021-03-01 22:17:39 +08:00
    不太严谨的定义:

    js 里面没有类的概念,虽然 es6 加了 class,算是种语法糖。但 js 内置类型就有 Function,这个是 JS 语言意义上的 Function,该 Function 下可以有属性(包括 property 之类)、有方法,原型可以访问,方法可以调用。

    当然,你看了会说,这 tmd 不是类和函数么?
    emm,设计思想不一样嘛,自动脑内转换下思路。
    renmu123
        8
    renmu123  
       2021-03-01 22:18:19 +08:00
    @misakawaque #5 菜鸟教程比较基础,可以简单过一遍熟悉一下 js 的风格,然后建议过一下 es6 的教程,可以看阮一峰的一本书,之后再想看就推荐 mozilla 的 mdn 文档了。其实大概过完 es6 教程就可以去实战,遇到不懂的地方再去看 mdn 就可以了
    Kasumi20
        9
    Kasumi20  
       2021-03-01 22:18:24 +08:00
    一个函数对象的属性有 length,比如((a, b) => {}).length 就等于 2,还有 bind(), apply()等方法
    across
        10
    across  
       2021-03-01 22:19:55 +08:00
    @across
    中间打那段错字了,纠正

    Function 下可以有属性(包括 prototype 之类),有方法。 属性可以访问,方法可以调用。
    autoxbc
        11
    autoxbc  
       2021-03-01 22:20:37 +08:00
    方法是挂在实例对象上的函数,方法在调用时会被隐式转递实例对象作为 this 参数,这也是 this 的本质,就是隐参数
    musi
        12
    musi  
       2021-03-01 22:57:54 +08:00
    初学者的话可以看 MDN 文档一步一步来
    https://developer.mozilla.org/zh-CN/docs/learn
    MDN 文档算是比较权威的,所以看这里一般都没错(可能会有一些翻译不严谨问题,有能力可以直接看英文原版)
    比如你会看到这一章:
    https://developer.mozilla.org/zh-CN/docs/Learn/Javascript/Building_blocks/Functions#%E5%87%BD%E6%95%B0%E4%B8%8E%E6%96%B9%E6%B3%95
    jinliming2
        13
    jinliming2  
       2021-03-02 00:29:54 +08:00
    函数和方法看你描述的是啥,他们可以是同一个东西。
    比如你写了 globalThis.foo = () => {}; 。那么 foo 就是被定义在全局环境下的一个函数,可以说 foo 是一个函数,也可以说 foo 是 globalThis 下的一个方法。foo() 就是调用 foo 这个“函数”,globalThis.foo() 就是调用 globalThis 下的 foo “方法”。
    虽然本质上没有区别。
    当你把它叫做“函数”的时候,一般是特指它自己本身;当你把它叫做“方法”的时候,一般特指它是属于某一个父级对象下的一个 function 类型的属性。
    weixiangzhe
        14
    weixiangzhe  
       2021-03-02 00:56:32 +08:00 via iPhone
    function 和 method, 你把方式放在又个 object 的属性上 那这个函数就是 这个 object 的方法了
    devwolf
        15
    devwolf  
       2021-03-02 08:30:52 +08:00
    个人认同楼上所指出的,函数和方法是不同场景下的称谓,。<br/>
    可能有点歪楼,我也有过类似的 [称谓 /定义疑问] 而整了份 demo 文在 csdn 上(知道会有人 ptsd,我只是随便找个地方)<br/>
    "js 中函数的四种方法以及类的三种方法" https://blog.csdn.net/qq_35306736/article/details/109180252?spm=1001.2014.3001.5501
    <br/>
    函数 有内部方法、实例方法(对象方法)、原型方法、静态方法(类方法)<br/>
    类 有实例方法(对象方法)、原型方法、静态方法(类方法)。<br/>
    不过我也是东施效颦式的从调用方法上去区分种类,肯定不入流。而且这些五花八门的叫法,个人记忆中大多来自机构视频。<br/>

    更权威的定义使用当然在 mdn 里,我在本帖里晒出来自己混乱的 demo,也是希望有大佬可以再来点更站得住脚的解析
    wanguorui123
        16
    wanguorui123  
       2021-03-02 08:39:07 +08:00 via iPhone   1
    洋芋、马铃薯、土豆有什么区别
    devwolf
        17
    devwolf  
       2021-03-02 08:43:37 +08:00
    快,你想多快呀(为啥想花 3 天时间速览,js 的水也没那么浅吧。不过要用到框架的话,就跟着框架使用到的高频知识点为方向去查?)

    个人认为的花费时间 :阮一峰 es6 标准入门 < 菜鸟教程 js < Javascript 高级程序设计 < MDN 。
    你想更快点,那就机构视频 /慕课网这些网课视频了
    yaphets666
        18
    yaphets666  
       2021-03-02 09:11:52 +08:00
    没区别.难道在其他语言里函数和方法有区别吗?
    gdrk
        19
    gdrk  
       2021-03-02 09:33:24 +08:00
    没区别啊,有其它语言基础的只要花点功夫理解 js 的原型链很快就能上手了。
    marcong95
        20
    marcong95  
       2021-03-02 09:56:05 +08:00
    @yaphets666 #18 Objective C 了解一下?
    Hoshinokozo
        21
    Hoshinokozo  
       2021-03-02 10:06:30 +08:00
    难道不是类或者对象内的成员函数就叫方法吗?
    yaphets666
        22
    yaphets666  
       2021-03-02 10:08:22 +08:00
    @marcong95 和 js 是一样的 Objcet.a() 和 a()的区别的 本质上没啥区别 都是数学意义上的函数
    jadeborner
        23
    jadeborner  
       2021-03-02 10:18:29 +08:00
    方法是指对象中的函数,可以用 this,全局的函数在严格模式下不能用 this
    marcong95
        24
    marcong95  
       2021-03-02 10:22:40 +08:00
    @yaphets666 #22 对 OC 的记忆有点模糊了,我指的是[object a]跟 object.a(),印象中好像是有点区别的。而且编程的函数一般都不是数学意义的函数把,数学意义上的函数只是一个映射而已,并没有副作用。
    chonerlee
        25
    chonerlee  
       2021-03-02 10:37:36 +08:00
    我觉得楼主可以这样理解:同一个东西的两个名字,没有和任何对象关联的时候(调用:a())就叫函数,和任何对象有关联的时候(调用:obj.a())叫方法。
    anjianshi
        26
    anjianshi  
       2021-03-02 10:41:47 +08:00
    我觉得函数和方法,就是“人”和“工人”的关系:
    - “方法”就是“函数”,当“函数”被放在某个类中时,我们会把它叫做“方法”,但其实它依然就是一个“函数”。
    - “工人”是“人”,但在“工厂”这个场景下,我们把“人”称为“工人”,但他依然就是一个“人”
    ubbcou
        27
    ubbcou  
       2021-03-02 11:18:32 +08:00
    在《深入理解 es6 》第四章有这么以一句话:
    在 ES6 之前,“方法”的概念从未被正式定义,它此前仅指对象的函数属性(而非数据属
    性)。ES6 则正式做出了定义:方法是一个拥有 [[HomeObject]] 内部属性的函数,此内部
    属性指向该方法所属的对象。
    mascteen
        28
    mascteen  
       2021-03-02 12:26:32 +08:00 via Android
    @devwolf youtuber 这类视频很多,不过一般视频很长有几个小时
    dk7952638
        29
    dk7952638  
       2021-03-02 13:08:02 +08:00
    严格来说,函数是不能有副作用的,而方法则不然
    WishMeLz
        30
    WishMeLz  
       2021-03-02 13:52:24 +08:00
    我的理解是:函数是 function,方法是 function 中有具体的业务代码逻辑。
    IvanLi127
        31
    IvanLi127  
       2021-03-02 14:52:50 +08:00
    函数+过程=方法。我印象中是这么个样子,然后就不太理解楼主为啥有这疑惑出,是不是有什么语言背景?
    journalistFromHK
        32
    journalistFromHK  
       2021-03-02 15:51:33 +08:00
    js 万物皆对象 字符串、数字、函数都属于对象 而对象都有属性和方法,这些属性和方法也属于对象 没必要弄清对象和方法有什么区别 因为没意义
    meteor957
        33
    meteor957  
       2021-03-02 15:52:45 +08:00
    没区别
    ayase252
        34
    ayase252  
       2021-03-02 15:58:11 +08:00
    ECMA-262 定义:
    Function: member of the Object type that may be invoked as a subroutine
    Method: function that is the value of a property

    方法是作为一个属性的值的函数
    libook
        35
    libook  
       2021-03-02 16:49:45 +08:00
    个人认为方法是面向对象的一个子概念,一个对象的方法可以对这个对象进行操作或者进行一些和这个对象有关的操作。

    函数就是对输入进行处理然后输出结果的过程。

    举个例子,比如“下雨”;用方法来实现就是你需要先构造一个“雨”的 Class 或构造函数,然后在其原型上加一个“下”的方法;用函数的来实现就是构造一个通用的“下”函数,然后把“雨”作为参数传进去(当然你也可以传“雪”、“冰雹”、“馅饼”)。

    从 JS 内部原理来说,方法和函数主要区别在于 this,即过程执行的环境。某种程度来说,方法也是一种函数,只不过方法的运行通常是以对象数据为基础的,方法的 this 为对象本身。
    没有依赖于任何对象的,可以实现独立功能的函数,就是我们一般说的“函数”。

    函数式编程和面向对象编程是两种思想,JS 两种都支持(可能写法和其他语言不大一样),如何认定也取决于开发人员自己的规划。
    codeDreamfy
        36
    codeDreamfy  
       2021-03-02 16:53:15 +08:00
    看你是如何使用的吧, 如果是挂载到某个对象的属性下,那就是方法,如果是独立使用那就是函数,不同场景叫法不同而已
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5529 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 08:59 PVG 16:59 LAX 01:59 JFK 04:59
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86