问题描述
有人可以向我解释何时使用函数通过将变量提供到括号中,以及何时在带有句点的变量之后添加函数,如使用toString()函数?
示例代码
function addMe(a){
a = a+1;
return a;
}
var num = 1;
addMe(num);
num.toString();
我不确定我的语法是否正确,但我想知道何时将变量作为参数提供,例如我如何将变量num提供给addMe函数。 并且何时通过在变量之后放置一个句点并输入函数来使用函数.toString()。
如果我正确地构建了我的功能,我可以做这样的事吗?
var num = 1;
num.addMe();
谢谢您的帮助!
1楼
第一个用于简单的“独立”功能,而后者用于对象方法。 例如,默认情况下,数字对象具有toString()方法。 某些对象方法也可能需要在括号之间传递参数。
2楼
变量(函数声明只是存储在变量中的函数)在作用域链中查找(进入下一个外部作用域,直到找到具有该名称的变量):
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
由一个,然后copues的值a
回num
。
3楼
当您执行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中,这称为原型。 Prototype是JavaScript从另一个获取某些功能的一种方式。 基本上:我有各种各样的功能,什么对象可以使用什么功能。 这被称为原型链。
在这两种情况下,您都在使用一个函数。 addMe是您创建的函数,toString是JavaScript中的一个函数,它通过此原型链放置在对象上。
我真的不确定我的语法是否正确
是的,你的语法是正确的。 addMe函数是在JavaScript中创建函数的标准方法。
但我想知道何时将变量作为参数提供,例如我如何将变量num提供给addMe函数。
就像你一样,你像你一样定义一个函数和参数。
..以及何时使用函数.toString()通过在变量后面加一个句点并输入函数。
如果要将函数放在对象上,以便该对象的所有实例都可以成为该对象。
在大多数情况下,特别是当你开始时。 您不必担心这些原型。 你的方式。
function addMe(number) {
return number+1
}
const answer = addMe(1) //2
是定义函数并调用它的标准方法。