方法与功能,以及其他问题

时间:2013-03-08 01:41:32

标签: javascript function methods

关于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;

8 个答案:

答案 0 :(得分:35)

回答你的标题问题''功能'和'方法'之间的区别。

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

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

在对象的范围内,函数被称为该对象的方法。它是从对象命名空间'MyObj.theMethod()'调用的。由于我们说函数是一个对象,函数中的函数被认为是该函数的一种方法。你可以说我将使用我的对象的保存方法。或者您可以说,“保存方法接受函数作为参数”。但是你通常不会说函数接受一个方法作为参数。

BTW Stoyan Stefanov的书籍Javascript模式详细介绍了你的问题,如果你真的想要理解这门语言,我强烈推荐它。这是关于这个主题的书的引用。

  

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

答案 1 :(得分:12)

存在细微差别 -

方法:方法是与对象关联的函数。

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

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

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

答案 2 :(得分: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(),它会返回heathmana的值。因此,我认为此实例中的getsetplayer.stats对象的方法。

答案 3 :(得分: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的对象

现在让我们说您需要调用“最喜欢的语言”。女巫是对象内部的一个函数。

您这样称呼

developer.favoriteLanguage('JavaScript');

// My favorite programming language is JavaScript'

因此我们将其命名为:developer.favoriteLanguage('JavaScript'); 它不是功能,不是对象吗?这是什么?是一种方法

答案 4 :(得分: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

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

答案 5 :(得分:0)

函数执行语句列表示例:

 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 

方法的定义:方法是作为函数的对象的属性。方法定义为定义普通函数的方式,除了必须将它们指定为对象的属性。

答案 6 :(得分:0)

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

尽管人们通常在谈论JavaScript或面向对象的编程时通常会使用该词,但请注意,在ES6中,术语方法具有非常特殊的含义(请参见规范的here部分)。


方法定义

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

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

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

方法特异性

14.3 Method Definitions很好地概述了方法的特异性(严格意义上),即:

  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

答案 7 :(得分:0)

ecma document

  

4.3.31方法:   功能就是属性的值

     

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

非常清楚:当您调用某个函数时,如果它隐式具有一个this指向一个对象),并且如果您不能在没有对象的情况下调用该函数,则< strong>该功能应命名为方法