JavaScript中的函数vs方法

时间:2016-07-29 09:08:50

标签: javascript html5 canvas

在这个例子中,下面是函数或方法吗?我认为这是一个方法,因为它与img对象相关联。 任何人都可以澄清这个吗?

 img.onload = function () {
    ctx.drawImage(img, 10, 10);   
    ctx.drawImage(img, 170, 90);  
    ctx.drawImage(img, 170, 170); 
  };

非常感谢, P

3 个答案:

答案 0 :(得分:4)

JavaScript中的“方法”只是引用函数的对象的属性。来自the specification

  

方式

     

作为属性值的函数

所以从这个意义上说,你所展示的是“方法”和“功能”。

从另一个意义上说,如果将“方法”定义为“一个专门绑定给定对象或对象类的函数”,JavaScript根本就没有方法(但继续阅读)。 (关于我在博客上的更多信息:Mythical methods。)

例如,你可以考虑slice Array个对象的方法,但它可以用在你喜欢的任何其他对象上(只要该对象是 array-like ,因为否则slice不知道该怎么做):

var o = {
    0: "zero",
    1: "one",
    2: "two",
    length: 3,
    slice: Array.prototype.slice
};
console.log(o.slice(1));

也就是说,如果用this调用它们没有引用他们期望的对象类型(例如,Number#toString),某些函数将失败并显示错误,这在某种意义上说它们是真正的方法。

在任何情况下,确实使用术语“方法”来引用涉及函数的属性。事实上,the specification在讨论这样的事情时会这样做:

// ES2015+
let obj = {
    method() {
    }
};

和此:

// ES2015+
class Foo {
    method() {
    }
}

答案 1 :(得分:0)

方法是类型为Function

的属性

如果没有正式的语言特定定义,则应始终遵循常用的隐含含义。

在计算机编程中;

  • 方法是一个类的一部分,它可能会也可能不会返回一个值。
  • 函数是一组返回值的语句。
  • 过程是一组不返回值的语句。

但是如果有一种正式明确定义的语言,则应该使用它。

Javascript&#39> 功能方法

Javascript "ECMAScript 6"正式将术语功能定义为。

  

... function 是一个可调用的对象。

方法

  

通过属性与对象关联的函数称为方法

参考ecma-262 7.0, Ecmascript Overview

因为我一直使用功能而感到很糟糕,现在必须将我的所有文件修改为正确的术语。

<强>矛盾

它还会在用于描述和记录javascript代码的词法语法方面产生矛盾。

所有可调用的函数/方法都是Function个对象,并且具有Function.prototype。严格来说,在描述变量引用(或匿名)的内容时,只有函数。

例如考虑

var poo = function(){}; // Method window.poo, function poo.
function Foo(){  // this is a function?
    var tic = function(){}; // tic is a function
    this.Bar = function(){ // this is a function as well as a method
        this.poo = poo; // This is a method, it is also function
    }
    this.Boo = function(){
        this.poo = function(){ return poo}; // anon function returns the poo
                                            // to create the method Boo.poo
    }
}

Top是一个函数,因为它是一个可调用对象。但它也是顶级范围window(或上下文顶级范围)的属性,因此是window的方法。

因此,根据Javascript标准Foo定义,BarBoo函数,同时方法 。编程中的这种模糊性可能是一个可能导致错误的问题,或者如果像我这样的迂腐程序员被迫遵守设计规范则会更糟糕的设计评论。

建议词法使用&#34;方法&#34;和&#34;功能&#34;

我个人会选择使用以下词语 function method

  • 所有可调用语句列表都是函数,即它们的类型。
  • 我会称他们为函数,除非我重申他们属于的对象。
  • 我会称之为方法,当我毫不含糊地判断它们是属性的对象时。
  • 如果使用范围包括JavaScript实现语言(通常是c ++)进行文档记录,我将调用内部(从Javascript&#39; s上下文中隐藏)可调用代码作为方法函数,具体取决于是否返回值

从上面的代码。

  • FooBarBoopoo功能
  • Foowindow方法
  • BarFoo&#39> 方法
  • Bar&#39> 方法 poo什么都不做
  • Boo.poo是一种方法。
  • poo函数,即它的类型。
  • poowindowBarBoo *
  • 共有的功能
  • &#39;抽动&#39;是功能
  • 没有名为tic方法
  • 方法 Bar.poo函数中声明 Bar
  • 方法 Bar.poo被定义为匿名函数
  • 方法 Bar.poo功能的参考
  • 方法Boo.poo是对方法 window.poo
  • 的反对意见

* 因为poo是属性的对象存在歧义,将其称为函数

对方法所属对象的依据可以是上下文显式引用。

  • CanvasRenderingContext2D是用于渲染到画布的对象,drawImageclearRect是其两种方法。

或在上下文中隐式引用

  • 从画布获取上下文后,方法drawImagefillRect可用于覆盖所有像素。

Getters和setter是功能。它们是对象的方法,它们是属性,但在引用声明和定义语句列表时应该只被称为 functions 。或者只是对象的属性。调用它们方法意味着函数调用语法name()

匿名函数不能是方法,因为无法通过命名属性访问它们。

回答OP

  • onloadImage的属性。它永远不是Image
  • 的功能或方法
  • 类型Image的对象将具有方法 onload(如果已定义),在加载图像时调用。如果未定义方法 onload,则在加载图像时不会发生任何事情。
  • img.onload方法。或onloadimg方法。仅在为其分配了功能后才为真
  • drawImage函数,即它的类型。
  • ctx.drawImage方法
  • drawImagectx&#39> 方法,它是CanvasRenderingContext2D方法

答案 2 :(得分:-1)

我倾向于说Javascript中的每个函数都是一种方法。但我不确定这是否合理。如果我错了,请纠正我。

因此,一个方法有一个&#34;这个&#34;,这是受影响的对象。

在你的例子中这是= img

img.onload = function () {
  console.log(this);
  ...
}

好吧,任何功能都有&#34;窗口&#34; as&#34; this&#34 ;,除非它还有别的东西。