Javascript 方法vs函数,以及其他问题

Javascript 方法vs函数,以及其他问题,javascript,function,methods,Javascript,Function,Methods,关于JS,两者之间有什么区别?我知道方法与对象相关,但我不知道函数的用途是什么?它们各自的语法有何不同 另外,这两种语法的区别是什么: var myFirstFunc = function(param) { //Do something }; var myFirstFunc = function(param) { //Do something }; 及 另外,我在某个地方看到,在使用函数之前,我们需要执行类似的操作: obj.myFirstFunc = myFirstFunc

关于JS,两者之间有什么区别?我知道方法与对象相关,但我不知道函数的用途是什么?它们各自的语法有何不同

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

var myFirstFunc = function(param) {
    //Do something
};
var myFirstFunc = function(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;

几乎完全相同。第二种(通常)只是速记。但是,正如这个jsfiddle()所示,
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

但是如果没有充分的理由,就不应该这样做。

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

myFirstFunc(param);
myFirstFunc(param);
但您可以将其传递给另一个函数,因为它将返回如下函数:

function mySecondFunction(func_param){}
mySecondFunction(myFirstFunc);
第二行只是创建了一个名为
myFirstFunc
的函数,其引用方式如下:

myFirstFunc(param);
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
的值。因此,我将考虑<代码>获取< /COD>和<代码> SET在此示例中为“代码>播放器.STATS < /Cord>对象”的方法。p> 回答您的标题问题“函数”和“方法”之间的区别是什么

这是语义学,与你试图表达的内容有关

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

在对象的范围内,函数被称为该对象的方法。它是从对象名称空间调用的
MyObj.theMethod()。
因为我们说过函数是对象,函数中的函数可以被视为该函数的方法

function fun(param1, param2){
// some code...
}
你可以说“我将使用对象的save方法”和“这个save方法接受一个函数作为一个参数”。但是你通常不会说函数接受一个方法作为一个参数

顺便说一句,JavaScript Patterns by一书详细介绍了您的问题,如果您真的想了解该语言,我强烈建议您使用它。以下是这本书中关于该主题的一段引语:

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


有一点不同-

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

var obj = {
name : "John snow",
work : function someFun(paramA, paramB) {
    // some code..
}
功能:当没有对象与之关联时,它就进入了功能

function fun(param1, param2){
// some code...
}

函数执行语句列表,例如:

 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 

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

方法是值为函数的对象的属性。方法按以下格式对对象调用: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的对象中的属性

 const developer = {
  name: 'Andrew',
  sayHello: function () {
    console.log('Hi there!');
  },
  favoriteLanguage: function (language) {
    console.log(`My favorite programming language is ${language}`);
  }
};
现在假设您需要调用favoriteLanguage property witch,它是对象中的一个函数

你这么说

developer.favoriteLanguage('JavaScript');

// My favorite programming language is JavaScript'
所以我们把它命名为:developer.favoriteLanguage('JavaScript');
它不是一个函数它不是一个对象?它是什么?它是一个方法许多答案都在说,方法就是函数在对象上定义时所调用的方法

虽然人们在谈论JavaScript或面向对象编程时通常使用这个词(参见),但值得注意的是,在ES6中,术语“方法”具有非常具体的含义(参见规范的一节)


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

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

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

方法特异性 这很好地概括了方法的特殊性(严格意义上),即:

  • 方法被分配一个内部
    [[HomeObject]]
    属性,该属性允许