简单解释7个主要JavaScript概念
术语的目的是将一个特定的想法封装成一个优美而紧凑的词。 但是,如果您不了解单词的含义,就会失去意义。
在开发人员世界中,更高级的主题通常是遥不可及的,并且常常使新开发者望而却步。 部分原因是因为他们好像在读一本外国小说。 字母和单词可能看起来很熟悉,但是没有意义。
而且很难理解所有内容,尤其是如果您必须不断停下第二个单词来弄清楚句子试图告诉您的内容时。
在本文中,我决定编译我经常发现自己会为新开发人员翻译的前7个概念。 我希望您发现他们对成为更好的开发人员有用。
本文的重点是作为思想的参考/摘要,以帮助您尽快着手解决问题。 每个术语本身都是一个主题,但出于篇幅和易读性的目的,我将其尽可能地简化为核心思想。
本书内容远不止这些,但总的来说,它抓住了每个单词试图传达的实质。
希望您发现它们有用。
感谢您的阅读!
1.不变性
数据形状不变时。
因此,如果您有一个进入函数的对象,则它以完全相同的形式从它中出来。 附加到它的数据可以更改,但参数的数量,名称和顺序不能更改。
例如,这是一个突变:
function changeMe(someObject){ someObject.age = 3; return someObject; } let exampleOne = {"cat": "Tibbers" }; console.log(changeMe(exampleOne));
该函数更改对象的形状,这意味着它是可变的。
2.陈述式
无论您按什么顺序进行操作,基本规则都可以确保您每次都能获得相同且正确的结果。
例如,该数学方程式遵循声明性方法。
(2 x 5) + 8 - 3 = 15
因此,如果您移动顺序,您仍将获得相同的结果。
- 3 + (2 x 5) + 8 = 158 - 3 + (2 x 5) = 15
在JavaScript编程中,声明性模式是函数的顺序与最终结果的构造无关紧要的地方。 您可以按任何顺序调用它们。 顺序无关紧要。
3.递归
当函数继续调用自身直到满足特定条件时。
不,这不是for循环。 听起来可能是这样,但事实并非如此。
for循环是JavaScript的条件方法。 递归是一个不断调用自身的完整函数。
这意味着递归有两个部分-基于特定条件的调用和exit子句。 您的退出子句基本上就是在递归结束时发生的事情。
这是一个简单的潜在递归:
function sumProfit(sales){ if(//condition for ending){ return theFinalObjectOrResult; } else { //do something. Reduce the condition. return sumProfit(reducedCondition); } }
4.回调
回调是在另一个函数执行完毕后才执行的函数。
我们为什么需要这个? 因为JavaScript是事件驱动的-意味着它不等待响应。 当事情以自给自足的方式运行时,这无关紧要。
当您开始依赖外部响应(例如API)时,情况就变得很严重。 延迟是您的JavaScript代码发送请求并将其接收回来所花费的时间。
在JavaScript看来,它已经完成了工作-它已成功执行了代码。
但是,实际上,您仍在等待回应。 有时,您会通过诺言或延迟计时器迫使代码冷静下来,放松一下,等待片刻。 确认完成后,您可以调用callback()函数。
无论如何,这是回调的样子:
function waitForMeeeee(someValues, callback){ //do something with someValues callback(); } waitForMeeeee('The answer is 42', function(){ alert('all done now'); } );
您还可以抽象出回调,并使其如下所示:
function waitForMeeeee(someValues, callback){ //do something with someValues callback(); } function allDone(){ alert('all done now'); } waitForMeeeee('The answer is 42', allDone);
5.异步
想想一条直线。 您的JavaScript代码从一端执行到另一端。 但是有时候,您需要暂停一下,只是在您跑到外部来源抢东西的那一刻。
暂停的时刻是JavaScript的异步部分。
关键字async还返回隐式的Promise。
隐式是什么意思? 默认情况下,它返回一个promise。
什么是诺言? 这是告诉您的代码等待的原因,因为完成某些工作会有所延迟。 例如,您在等待外部API用正确的数据响应。
为什么这很重要? 因为您可以将then()与异步函数一起使用。
那么()是什么? 您的回调相当于基于承诺的函数,可让您在承诺完成执行后执行操作。
看起来像什么? 这是一个例子:
async function doSomething(){ //do something there. return 'woot!';} doSomething().then(function(result){ console.log(result);});
或者,如果您真的想使承诺部分明确:
async function doSomething(){ //do something there. return Promise.resolve('woot!'); } doSomething().then(function(result){ console.log(result);});
6.代理
将其视为对象的附加扩展。 可以针对已存在的事物创建自定义行为。
在某种程度上,它还充当原始对象和其他功能之间的中介。
是。 代理可以更改和处理数据。
是。 除其他事项外,它通常用作验证检查器。
它是如何工作的?
代理包含三个部分-处理程序,陷阱(即方法)和目标。
有13个可用于代理的陷阱。 您需要对它们进行Google搜索,因为这超出了本文的范围。
这是一个已实施陷阱的代理示例:
let handler = { get: function(theObjectPassed, theObjectName){ //some checking logic console.log(theObjectPassed, theObjectName); return 'all done' ; } } let someObject = { a: 1, b: 2}; let valueName = new Proxy(someObject, handler); console.log(valueName.someObject);
代理的功能远不止于此,但是示例只是一个起点。
7.垃圾收集
一切都占用内存。 初始化变量后,将为其分配一点空间。
内存仅在调用时初始化。 因此,当一个函数运行并且内部有变量时,它的存在只会持续到该函数需要它的时间。 它不会停留在周围。
垃圾收集是清除内存的方式。
内存泄漏是指由于在全局空间中声明了变量而没有进行垃圾回收的情况,这会造成污染并占用不必要的空间。