55

关于JS,两者有什么区别?我知道方法与对象相关联,但我很困惑函数的目的是什么?它们各自的语法有何不同?

另外,这两种语法有什么区别:

var myFirstFunc = function(param) {
    //Do something
};

function myFirstFunc(param) {
    //Do something
};

另外,我在某处看到我们需要在使用函数之前做这样的事情:

obj.myFirstFunc = myFirstFunc;
obj.myFirstFunc("param");

为什么需要第一行,它有什么作用?

对不起,如果这些是基本问题,但我从 JS 开始并且很困惑。

编辑:对于最后一段代码,这就是我所说的:

// here we define our method using "this", before we even introduce bob
var setAge = function (newAge) {
  this.age = newAge;
};
// now we make bob
var bob = new Object();
bob.age = 30;
// and down here we just use the method we already made
bob.setAge = setAge;
4

8 回答 8

62

回答您关于“功能”和“方法”之间有什么区别的标题问题。

这是语义,与您要表达的内容有关。

在 JavaScript 中,每个函数都是一个对象。对象是键:值对的集合。如果一个值是基元(数字、字符串、布尔值)或其他对象,则该值被视为属性。如果一个值是一个函数,它被称为“方法”。

在对象的范围内,函数被称为该对象的方法。它是从对象命名空间调用的MyObj.theMethod().既然我们说函数是一个对象,那么函数中的函数可以被认为是该函数的方法。

你可以说“我将使用我的对象的保存方法”之类的话。并且“这个保存方法接受一个函数作为参数。” 但是您通常不会说函数接受方法作为参数。

顺便说一句,Stoyan Stefanov 的 JavaScript 模式一书详细介绍您的问题,如果您真的想了解该语言,我强烈推荐您阅读。以下是书中关于这个主题的引述:

因此,作为对象的函数 A 可能具有属性和方法,其中一个恰好是另一个函数 B。然后 B 可以接受函数 C 作为参数,并且在执行时可以返回另一个函数 D。

于 2013-03-08T02:30:35.297 回答
32

有一点点不同——

方法:当对象与它关联时,方法是一个函数。

var obj = {
name : "John snow",
work : function someFun(paramA, paramB) {
    // some code..
}

功能:当没有对象与之关联时,它就起作用了。

function fun(param1, param2){
// some code...
}
于 2017-01-20T06:29:51.960 回答
20

许多答案都在说方法是在对象上定义时调用的函数。

虽然当人们谈论 JavaScript 或一般的面向对象编程时使用这个词的方式通常是正确的(参见此处),但值得注意的是,在 ES6 中,方法一词具有非常具体的含义(参见第14.3 节方法)规范的定义)。


方法定义

方法(严格意义上)是通过对象字面量中的简洁方法语法或类声明/表达式中的类方法定义的函数

// In object literals:
const obj = {
    method() {}
};

// In class declarations:
class MyClass {
    method() {}
}

方法特异性

这个答案很好地概述了方法的特殊性(严格意义上),即:

  1. [[HomeObject]]方法被分配了一个允许它们使用的内部属性super
  2. 方法不是用prototype属性创建的,它们没有内部[[Construct]]方法,这意味着它们不能用new.
  3. 方法的名称不会成为方法范围内的绑定。

下面是一些示例,说明方法(严格意义上)与通过函数表达式在对象上定义的函数有何不同:

示例 1

const obj = {
    method() {
        super.test;         // All good!
    },
    ordinaryFunction: function ordinaryFunction() {
        super.test;         // SyntaxError: 'super' keyword unexpected here
    }
};

示例 2

const obj = {
    method() {},
    ordinaryFunction: function ordinaryFunction() {}
};

console.log( obj.ordinaryFunction.hasOwnProperty( 'prototype' ) );  // true
console.log( obj.method.hasOwnProperty( 'prototype' ) );            // false

new obj.ordinaryFunction();     // All good !
new obj.method();               // TypeError: obj.method is not a constructor

示例 3

const obj = {
    method() {
        console.log( method );
    },
    ordinaryFunction: function ordinaryFunction() {
        console.log( ordinaryFunction );
    }
};

obj.ordinaryFunction()  // All good!
obj.method()            // ReferenceError: method is not defined

于 2019-03-02T17:55:09.513 回答
1

您的第一行是创建一个引用函数的对象。你会这样引用它:

myFirstFunc(param);

但是你可以将它传递给另一个函数,因为它会像这样返回函数:

function mySecondFunction(func_param){}
mySecondFunction(myFirstFunc);

第二行只是创建了一个函数myFirstFunc,它的引用方式如下:

myFirstFunc(param);

并且在范围上受到限制,具体取决于它的声明位置,如果它在任何其他函数之外声明它属于全局范围。但是,您可以在另一个函数中声明一个函数。然后,该函数的范围仅限于在其内部声明的函数。

function functionOne(){
    function functionTwo(){}; //only accessed via the functionOne scope!
}

您的最后一个示例是创建函数实例,然后通过对象参数引用这些实例。所以这:

function myFirstFunc(param){};

obj.myFirst = myFirstFunc(); //not right!
obj.myFirst = new myFirstFunc(); //right!

obj.myFirst('something here'); //now calling the function

表示您有一个引用函数实例的对象。这里的关键是,如果函数更改,您存储的引用obj.myFirst将不会更改。

虽然@kevin 基本上是正确的,但 JS 中只有函数,您可以创建更像方法而不是函数的函数,例如:

function player(){

    this.stats = {
        health: 0,
        mana: 0,

        get : function(){
            return this;
        },

        set : function( stats ){
            this.health = stats.health;
            this.mana = stats.mana;
        }  
}    

然后你可以调用player.stats.get()它,它会返回给你heath, 和的值mana。所以我会考虑getandset在这种情况下是player.stats对象的方法。

于 2013-03-08T02:07:06.490 回答
1

函数执行语句列表示例:

 function add() { 
     var a = 2; 
     var b = 3;
     var c = a + b;
     return c;
 }

1) 方法是应用于对象示例的函数:

 var message = "Hello world!";
 var x = message.toUpperCase(); // .toUpperCase() is a built in function

2) 使用对象构造函数创建方法。一旦方法属于该对象,您就可以将其应用于该对象。例子:

function Person(first, last, age, eyecolor) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eyecolor;
    this.name = function() {return this.firstName + " " + this.lastName;};
}

document.getElementById("demo").innerHTML = person.fullName(); // using the 
method 

方法的定义:方法是作为函数的对象的属性。方法的定义方式与定义普通函数的方式相同,只是它们必须作为对象的属性进行分配。

于 2018-03-04T09:24:27.127 回答
1

方法是对象的属性,其值为函数。方法以下列格式在对象上调用:object.method()。

//这是一个名为developer的对象

 const developer = {
  name: 'Andrew',
  sayHello: function () {
    console.log('Hi there!');
  },
  favoriteLanguage: function (language) {
    console.log(`My favorite programming language is ${language}`);
  }
};

// favoriteLanguage: 和 sayHello: 和 name: 都是名为 developer 的对象中的属性

现在假设您需要调用 favoriteLanguage 适当的女巫是对象内部的一个函数..

你这样称呼它

developer.favoriteLanguage('JavaScript');

// My favorite programming language is JavaScript'

所以我们称之为:developer.favoriteLanguage('JavaScript'); 它不是一个函数它不是一个对象?这是什么?它是一种方法

于 2018-08-13T23:33:04.037 回答
0
var myFirstFunc = function(param) {
    //Do something
};

function myFirstFunc(param) {
    //Do something
};

(几乎)相同。第二个是(通常)只是简写。但是,正如这个 jsfiddle ( http://jsfiddle.net/cu2Sy/ ) 所示,function myFirstFunc一旦进入封闭范围就会导致函数被定义,而myFirstFunc = function只有在执行到达该行时才会创建它。

至于方法,它们有一个this参数,即当前对象,所以:

var obj = {};
obj.func = function( ) {
    // here, "this" is obj
    this.test = 2;
}
console.log( obj.test ); // undefined
obj.func( );
console.log( obj.test ); // 2

您显示的确切语法是因为您也可以这样做:

function abc( ) {
    this.test = 2;
}
var obj = {};
obj.func = abc;
obj.func( ); // sets obj.test to 2

但你不应该没有充分的理由。

于 2013-03-08T01:48:09.690 回答
0

ecma 文件

4.3.31method : 作为属性值的函数

注意 当函数作为对象的方法被调用时,对象作为 this 值传递给函数。

很清楚:当你调用一个函数时,如果它隐含一个this指向一个对象)并且如果你不能在没有对象的情况下调用该函数,那么该函数应该命名为method

于 2019-11-07T07:45:53.050 回答