介绍
-
好吧,我们都开始在某个地方开始学习
JavaScript
,我希望我可以使用这种初学者指南来获得JS的基础知识。 -
如果您不熟悉JavaScript,这将是一本完美的阅读,以阐明您的技能或建立更强的基础。
喜欢阅读
什么是JavaScript
JS是同步的单线线程语言
Synchronous
-它按行执行代码。
Single-Threaded
-一次执行一行。
JS如何工作?
-
javaScript在执行上下文中工作
他们有2个组件,即Memory
和Code
-
内存也称为
Variable Environment
-
代码也称为
Thread of Execution
提升
- js代码升起是当JavaScript代码执行时,甚至在代码的第一行的执行之前,它扫描了函数和变量声明的整个代码
- 将其作为变量/标识符作为
undefined
在Global 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
let
和const
在全局对象上不是
取而代之的是,它们存储在一个的内存空间中,与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
- 在
let
和const
的情况下,不允许申报。 - 甚至连游戏机都无法正常工作ð
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全局范围
let
&const
是块范围,var
是全局范围的。
如何?
再次示例!假设我们执行此代码
{
var a = 10; //global
let b = 20; //block
const c = 30; //block
}
证明
阴影
这是JS的概念,其中变量使用var
掩盖了全局范围变量
var a = 10;
{
var a = 100; // this 'a' shadows the global scoped 'a'
}
console.log(a); // results 100
但是let
和const
的工作方式有所不同,因为它们不存在于当前范围之外
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以获取代码,请播放存储库。