Параметры функции JavaScript против методов объекта - PullRequest
0 голосов
/ 13 февраля 2019

Может ли кто-нибудь объяснить мне разницу в том, когда использовать функцию, вводя переменные в круглые скобки, а когда использовать функцию после переменной с точкой, например, используя функцию toString ()?

пример кода

function addMe(a){
a = a+1;
return a;
}
var num = 1;
addMe(num);
num.toString();

На самом деле я не уверен, что мой синтаксис правильный, но я хочу знать, когда передать переменную в качестве параметра, например, как я передаю переменную num, в addMeфункция.И когда использовать функцию .toString (), поставив точку после переменной и напечатав функцию.

Могу ли я сделать что-то подобное при условии, что я правильно построил свою функцию?

var num = 1;
num.addMe();

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Переменные (объявление функции - это просто функция, хранящаяся в переменной) ищутся в цепочке областей (переходя к следующей внешней области, пока не будет найдена переменная с именем):

 let a = 1; // outer scope

 { // inner scope
   console.log(a); // looked up in "inner scope", than "outer scope"
}

Свойства объекта ищутся в цепочке прототипов объектов, поэтому, если вы выполните

a.b

, тогда a будет просмотрено в областях, как объяснено выше, а затем к b будет получен доступ к полученномуобъект (все является объектом в JavaScript, за исключением «ничего» (undefined, null)) путем поиска цепочки прототипов.Для простого объекта цепочка довольно короткая:

 const a = { b: 1 }; // object -> Object.prototype

Здесь b будет найдено в самом объекте.Однако все объекты наследуются от объекта Object.prototype, поэтому, если вы добавите к этому свойство (пожалуйста, не надо):

 Object.prototype.test = 1;

, вы сможете найти его на каждом объекте, так как поиск проходит вверхцепочка прототипов, и достигает Object.prototype:

 console.log({}.test); // 1

Теперь для чисел (как в вашем случае) они наследуют Number.prototype, так что вы можете сделать:

Number.prototype.addMe = function() {
 console.log(this);
};

// two dots are needed to distinguish it from numbers with a fraction (e.g. 1.2)
1..addMe();

Тосказал, что теперь addMe можно вызывать на каждый номер, везде в вашем коде.Хотя это может показаться полезным, на самом деле это неприятно, поскольку вы не знаете, где был добавлен определенный метод

 1..whereDoIComeFrom()

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


Я предполагаю, что addMe - это просто упрощенный пример, если это не так, читайте дальше:

Если вы передадите аргумент функции в JavaScript, значение будет скопировано (это немного сложнее с не примитивами (все, кроме чисел, логических значений и т. д.)) в переменную параметрафункции, названной так здесь:

function addMe(a){
 a = a+1;
 console.log(a); // 2
 return a;
}

var num = 1;
addMe(num);
console.log(num); // 1 ... ?

вы фактически получили две переменные (a и num), изменение a не изменит num.Но когда вы возвращаете a, вы можете сделать:

num = addMe(num);

, который копирует значение num в a, затем увеличивает a на единицу и затем копирует значение a обратнодо num.

0 голосов
/ 13 февраля 2019

Когда вы сделали var num = 1, вы создали объект JavaScript.Это выглядит как число, но вы можете думать обо всем в JavaScript как об объекте (упрощение), и все эти объекты имеют различные функции.Таким образом, у числа есть некоторые особенности, у строки есть некоторые другие особенности и т. Д.

Вы упомянули одну особенность: toString.Еще одна функция: toLowerCase.

toString и toLowerCase - это функции, которые поставляются с JavaScript.Затем эти функции «надевают» все эти объекты, чтобы мы могли их использовать.

У меня может быть строковая переменная, такая как

var text = 'MY TEXT'
var lowercaseText = text.toLowerCase()
console.log(lowercaseText) // my text

Этот код будет работать, потому что было решено, что функция toLowerCase должна работать со строками

У меня также может быть массив (список элементов)

const list = ['A', 'B', 'C']

const answer = list.toLowerCase()
console.log(answer)

Но этот код не будет работать, потому что toLowerCase не работает с массивами.Таким образом, вы получаете следующее сообщение об ошибке: list.toLowerCase is not a function.

В основном это говорит: я не знаю, что означает toLowerCase, когда используется в этой переменной списка (массив).

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

В обоих случаях вы используете функцию.addMe - это созданная вами функция, а toString - это функция в JavaScript, которая была размещена на объектах в этой цепочке прототипов.

Я не уверен, что мой синтаксис правильный

Да, ваш синтаксис правильный.Ваша функция addMe является стандартным способом создания функции в JavaScript.

Но я хочу знать, когда передавать переменную в качестве параметра, например, как я передаю переменную num, в функцию addMe.

Точно так же, как вы это сделали, вы определяете функцию и параметры, как и вы.

.. и когда использовать функцию .toString (), ставя точку послепеременная и ввод функции.

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

В большинстве случаев, особеннокогда вы начинаете.Вам не нужно беспокоиться об этих прототипах.То, как вы это сделали.

function addMe(number) {
  return number+1 
}

const answer = addMe(1) //2

Это стандартный способ определения функции и ее вызова.

0 голосов
/ 13 февраля 2019

Первый используется для простых «автономных» функций, а второй - для методов объекта.Например, у числового объекта по умолчанию есть метод toString ().Некоторые методы объекта могут также требовать передачи параметров в скобках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...