javaScriptEssentialsð§âð»
#javascript #网络开发人员 #编程 #codenewbie

介绍

  • 好吧,我们都开始在某个地方开始学习JavaScript,我希望我可以使用这种初学者指南来获得JS的基础知识。

  • 如果您不熟悉JavaScript,这将是一本完美的阅读,以阐明您的技能或建立更强的基础。

喜欢阅读

什么是JavaScript

JS是同步的单线线程语言

Synchronous-它按行执行代码。
Single-Threaded-一次执行一行。

JS如何工作?

  • javaScript在执行上下文中工作
    他们有2个组件,即MemoryCode

  • 内存也称为Variable Environment

  • 代码也称为Thread of Execution

提升

  • js代码升起是当JavaScript代码执行时,甚至在代码的第一行的执行之前,它扫描了函数和变量声明的整个代码
  • 将其作为变量/标识符作为undefinedGlobal Execution Context中分配,并在functions中创建参考。
var x = 10; // x will be undefined before execution

function getName() {
  console.log("Hello World");
} // gets copied entirely

未定义的VS未定义

  • JavaScript创建了全局执行上下文,
  • 它将内存分配给所有声明的变量和函数
  • 默认情况下,它将undefined分配给它。当执行变量分配行时,它将各个值分配给它。

例如undefined

var a;
console.log(a === undefined); //true

没有定义的

当JS试图找到在初始扫描中找不到的变量时,它给出了。暗示没有分配给变量的内存。

我kude12

var a = 10;
console.log(x); //here x is not defined in the scope

ReferenceError: x is not defined

时间死区 -

让我们看这个示例

console.log(a); // Error
console.log(b); // undefined
let a = 10;
var b = 10;

ReferenceError: cannot access 'a' before initialization

letconst在全局对象上不是
取而代之的是,它们存储在一个的内存空间中,与global 称为SCRIPT,并且由于console.log指向global对象,因此在其中没有找到let a = 10;

时间死区的示例

1. let c;
2. const a = 10;
3. if (a === 10) {
4.   c = "Temporal Dead Zone Ended";
5. }

在这里,上面的示例表明,在分配了任何值之前,它将保留在称为Temporal Dead Zoneð

的特殊区域中

令v/s const v/s var

  1. letconst的情况下,不允许申报。
  2. 甚至连游戏机都无法正常工作ð
console.log("This will not print");
let a = 10;
var a = 10; // Redeclaration of identifier 'a'

导致
SyntaxError: Identifier 'a' has already been declared.

var a = 10;
var a = "Please like this article";

没有错误,在var中允许RE声明

如何避免时间死区?

- 始终将您的声明放在文件的顶部,以便一旦开始执行,它就会声明所有变量。
- 通过这样做,我们可以通过移动顶部的所有声明来缩小零件窗口接近零。

JavaScript中的块

块是{}覆盖的一组线,将其作为单个语句提供。

例子

if (true) console.log("Single Statement");

这就是我们不需要Curly Braces {}的原因 我们使用{}提供一个块,具有多个语句

例子

if(condition){
  line1;
  line2;
  ...
} else {...}

function hello(){
 line1;
 line2;
 ...
}

范围V/S全局范围

letconst是块范围,var是全局范围的。

如何?

再次示例!假设我们执行此代码

{
  var a = 10; //global
  let b = 20; //block
  const c = 30; //block
}

证明

Browser Console Proof

阴影

这是JS的概念,其中变量使用var掩盖了全局范围变量

var a = 10;
{
  var a = 100; // this 'a' shadows the global scoped 'a'
}
console.log(a); // results 100

但是letconst的工作方式有所不同,因为它们不存在于当前范围之外

let b = 10;
{
  let b = 100;
}
console.log(b); // results 10

let c = 1;
{
  let c = 10;
}
console.log(c); // results 1

非法阴影ðμâð«

当我们尝试使用var范围声明变量的let时。

let a = 100;
{
  var a = 10; // Error! Illegal Shadowing
  let a = 2; // works just fine!
}

SyntaxError: Identifier 'a' has already been declared

关闭ð¶

与其词汇范围捆绑的功能已关闭。

示例很容易

function first() {
  var a = 10;
  function second() {
    console.log(a);
  }

  return second;
}
...
let getFunction = first();

/* after this line, instance of 
first() function is popped out of 
the call stack */
...
getFunction(); // outputs: 10;

理论上,它不应起作用,因为标识符a需要在范围之外,但是当返回second()功能时,它也带有其词汇范围。那就是封闭。

关于Settimeout和关闭的棘手采访问题

问题语句 - 从1到5的打印数字,每个间隔为1秒。

您可能会相信这是一个简单的问题,并且会提出一个像这样的代码ð

for (var i = 0; i <= 5; i++) {
  setTimeout(() => {
    console.log(i);
  }, i * 1000);
}

上面的代码通过在每行中打印6条将错误的(why?)出现。可以通过仅使用let而不是var

来解决

如果什么?

访调员要求您仅与var一起做?

放松不要出汗。我会告诉你要编码什么并解释它的工作原理。

这是您对ð
感兴趣的代码 用解释

for (var i = 0; i <= 5; i++) {
  // used var
  function closure(i) {
    setTimeout(() => {
      console.log(i);
    }, i * 1000);
    closure(i);
  }
}

确定问题

  • 使用var的先前代码的问题是JS维护执行上下文,而setTimeout()的工作方式是它存储回调函数并将计时器附加到其上并转到下一行。

  • 由于可变i在回调函数中不存在,因此指向i的外部引用。

  • 现在,它可以使用计时器创建5份函数副本,现在由计时器到期,JS不再等待,for循环结束。为时已晚。 i的值终于变为6

解决问题

修复1:使用让声明

我们上面已经讨论了let是块范围的,答案位于该行内。

当我们使用let时,它会为其内存分配创建单独的块。而在var的情况下

修复2:使用封闭或功能

实际上,每当setTimeout()被称为

时,这实际上都会为他们提供新的i副本

写作功能的类型

功能声明

function hello() {
  console.log("Like This Blog and star the repo");
}

功能表达式

const callAPI = async function () {
  const data = fetch("https://somesite.io/get/data/1232");
  return data;
};

参数v/s参数

function greet(name) {
  // identifier name is a parameter
  console.log(`Hello ${name}`);
}

greet("Gautam"); // "Gautam" is an Argument

头等舱功能

  • 在其arguments中具有功能的功能。

  • 函数用作值的能力,并能够返回并以arguments的形式传递到另一个function

function first(doesSomething) {
  doesSomething();
}

first(() => {
  console.log("hello World");
});

JS中的回调功能

这些功能是在其他功能的参数中发送的,并在需要时分别使用,

setTimeout(function () {
  console.log("Timer");
}, 5000);
function x(y) {
  console.log("x");
}

x(function y() {
  console.log("y");
});

箭头功能

  • 这些功能是在ES6或Ecmascript 6(2015)中引入的
  • 他们只允许我们写较短的语法

function incrementCounter() {
  count++;
  setData("");
}

const incrementCounter = () => {
  count++;
  setData("");
};

上面的方法允许我们在不使用function关键字的情况下编写功能。


如果您喜欢阅读直到这里。请喜欢此博客,然后前往github以获取代码,请播放存储库。