方法与函数,以及其他问题

IT技术 javascript function methods
2021-03-05 05:23:38

关于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;
6个回答

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

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

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

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

你可以这样说:“我将使用我的对象的 save方法。” 以及“这个保存方法接受一个函数作为参数。” 但是你通常不会说一个函数接受一个方法作为参数。

顺便说一句,这本书的JavaScript模式斯托扬斯特凡包括您详细的问题,我强烈建议,如果你真的想了解的语言。这是书中关于这个主题的引述:

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

@TinaChen 你说得对,这个答案反映了 2013 年 javascript 的状态,需要针对 ES6 进行更新。坦率地说,整件事并不那么重要。随意调用它:函数/方法。一个函数通常位于顶级(全局)命名空间中,一个方法属于一个类/对象命名空间并且必须使用该接收器调用。
2021-04-26 05:23:38
原语是数字、字符串、布尔值
2021-05-10 05:23:38
根据这个答案,只是说If a value is a function, it is called a 'method'. 似乎不准确?
2021-05-13 05:23:38

有一点区别——

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

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

功能:当没有对象与之关联时,它就涉及功能。

function fun(param1, param2){
// some code...
}
很好,简单的答案。
2021-04-26 05:23:38

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

虽然当人们谈论 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

优秀的现代答案
2021-04-20 05:23:38

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

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所以我会考虑get并且set在这种情况下是player.stats对象的方法

这实际上有帮助。如果我有疑问,我会更多地查找并进一步询问
2021-05-06 05:23:38
您评论说它不能作为参数传递是不正确的。
2021-05-07 05:23:38

一个函数执行一系列语句示例:

 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 

方法的定义:方法是作为函数的对象的属性。方法的定义方式与普通函数的定义方式相同,不同之处在于它们必须被分配为对象的属性。