Подтвердить что ты не робот

Метод против функций и другие вопросы

Что касается JS, какая разница между ними? Я знаю, что методы связаны с объектами, но я смущен, какова цель функций? Как отличается синтаксис каждого из них?

Кроме того, какая разница между этими двумя синтаксисами:

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

и

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

Кроме того, я увидел, что перед использованием функции нужно сделать что-то вроде этого:

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

Почему требуется первая строка и что она делает?

Извините, если это основные вопросы, но я начинаю с JS и смущен.

EDIT: для последнего бита кода это то, о чем я говорю:

// 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;
4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос с вопросом о том, какая разница между "функцией" и "методом".

Это семантика и связана с тем, что вы пытаетесь выразить.

В javascript каждая функция является объектом. Объект представляет собой набор пар ключ: значение. Если значение является примитивным (целое, строковое, логическое) или другим объектом, значение считается свойством. Если значение является функцией, оно называется "методом".

В рамках объекта функция называется методом этого объекта. Он вызывается из пространства имен объектов "MyObj.theMethod()". Поскольку мы сказали, что функция является объектом, функция внутри функции считается методом этой функции. Вы можете сказать, что я собираюсь использовать метод моего объекта. Или вы могли бы сказать: "метод сохранения принимает функцию как параметр". Но вы вообще не сказали бы, что функция принимает метод в качестве параметра.

Кстати, книги Javascript Patterns от Стоян Стефанов подробно освещает ваши вопросы, и я очень рекомендую его, если вы действительно хотите понять язык. Вот цитата из книги по этому вопросу.

Так может случиться, что функция A, являющаяся объектом, имеет свойства и методы, одна из которых оказывается другой функцией B. Тогда B может принять функцию C как аргумент и, при выполнении, может вернуть другую функцию D.

Ответ 2

Есть небольшая разница -

Метод: Метод - это функция, когда объект связан с ним.

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

Функция: когда ни один объект не связан с ним, он приходит к функции.

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

Ответ 3

Ваша первая строка создает объект, который ссылается на функцию. Вы ссылаетесь на это следующим образом:

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.

Ответ 4

Метод является свойством объекта, значение которого является функцией. Методы вызывают объекты в следующем формате: 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: and sayHello: и имя: все они являются притязаниями в объекте с именем developer

теперь можно сказать, что вам нужно было позвонить в избранноеLanguage propriety, ведьма - это функция внутри объекта.

вы называете это так

developer.favoriteLanguage('JavaScript');

// My favorite programming language is JavaScript'

так что мы назовем это: developer.favoriteLanguage('JavaScript'); его не функция, а не объект? что это? его метод

Ответ 5

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

но вы не должны без уважительной причины.

Ответ 6

Функция выполняет список примеров:

 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 

Определение метода: метод является свойством объекта, который является функцией. Методы определяются способом определения нормальных функций, за исключением того, что они должны быть назначены как свойство объекта.

Ответ 7

Многие ответы говорят что-то вроде того, что метод - это то, что функция вызывается, когда она определена для объекта.

Хотя это часто верно в том смысле, как слово используется, когда люди говорят о 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
    }
};

Ответ 8

Первый написан в JS-объектных литералах. Вы можете создавать свои объекты таким образом, их легче читать, а также вы можете следовать шаблонам проектирования. Другая функция также является функцией, а также вы можете рассматривать ее как объект в зависимости от вашего JS-кода.

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

Эти две строки создают этот myFirstFunc (param), тогда как первый не нуждается в создании экземпляра.

Также этот вопрос задавали раньше. См. В чем разница между выражением функции и объявлением в JavaScript?