自学内容网 自学内容网

【JavaScript】JavaScript开篇基础(2)

1.❤️❤️前言~🥳🎉🎉🎉

Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。

如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的内容感兴趣,记得关注我👀👀以便不错过每一篇精彩。

当然,如果在阅读中发现任何问题或疑问,我非常欢迎你在评论区留言指正🗨️🗨️。让我们共同努力,一起进步!

加油,一起CHIN UP!💪💪

🔗个人主页:E绵绵的博客
📚所属专栏:

1. JAVA知识点专栏

        深入探索JAVA的核心概念与技术细节

2.JAVA题目练习

        实战演练,巩固JAVA编程技能

3.c语言知识点专栏

        揭示c语言的底层逻辑与高级特性

4.c语言题目练习

        挑战自我,提升c语言编程能力

5.Mysql数据库专栏

        了解Mysql知识点,提升数据库管理能力

6.html5知识点专栏

        学习前端知识,更好的运用它

7. css3知识点专栏

        在学习html5的基础上更加熟练运用前端

8.JavaScript专栏

        在学习html5和css3的基础上使我们的前端使用更高级

📘 持续更新中,敬请期待❤️❤️

2.作用域

JavaScript 中的作用域(Scope)指的是变量和函数的可访问范围。主要分为以下几种类型:

 

 

 

3.全局变量和局部变量

4.函数内部还可以定义函数 

在 JavaScript 中,函数是头等公民,这意味着函数可以像其他数据类型一样被处理。函数可以作为其他函数的返回值、参数,甚至可以在函数内部定义。


5.作用域链 

作用域链是 JavaScript 中用于查找变量的一种机制。当你在代码中访问一个变量时,JavaScript 会按照以下规则查找该变量:

  1. 当前作用域:首先查找当前代码执行的作用域。
  2. 外部作用域:如果在当前作用域中找不到该变量,JavaScript 会查找外部作用域,直到找到该变量或达到全局作用域。
  3. 全局作用域:如果全局作用域中仍然找不到该变量,则会抛出错误。

作用域链的形成是由于 JavaScript 的词法作用域特性(Lexical Scoping),也就是说,函数的作用域是在定义时确定的,而不是在调用时确定的。这意味着内部函数可以访问其外部函数的变量。

这在对付重名的变量时该规则很有用。

const name = 'Global Name';  // 全局变量

function firstLevel() {
  const name = 'First Level Name';  // 第一层函数中的变量

  function secondLevel() {
    const name = 'Second Level Name';  // 第二层函数中的变量

    function thirdLevel() {
      const name = 'Third Level Name';  // 第三层函数中的变量

      console.log('Third Level:', name);    // 输出:Third Level Name
      console.log('Second Level:', secondLevel()); // 查找上层输出

 6.变量的三种声明

在 JavaScript 中,变量的声明有几种方式,分别是使用 varletconst,它们在作用域、可变性等方面有不同的行为。下面是它们的详细说明:

 var 声明

var 是 JavaScript 中最早的变量声明方式,它有以下特点:

  • 作用域var 声明的变量具有函数作用域,而不是块作用域。这意味着即使在块(如 iffor 语句)中声明的变量,其作用域也扩展到整个函数内(如果不在函数中,则为全局作用域)。
  • 可重复声明:同一作用域内可以多次用 var 声明同一个变量名,不会报错,但会覆盖前一次的值。
if (true) {
  let x = 10;
  console.log(x); // 10
}
console.log(x); // 报错:x is not defined

let y = 20;
// let y = 30; // 报错,不能重复声明

 let 声明

let 是在 ES6(ECMAScript 2015)中引入的,它更符合现代开发习惯,有以下特点:

  • 作用域let 声明的变量不仅可以在函数作用域,全局作用域,还有块作用域。这使得 let 更适合在循环、条件判断等代码块中使用,避免变量污染全局作用域或函数作用域。
  • 不可重复声明:在同一作用域内不能用 let 重复声明同一个变量,否则会报错。
if (true) {
  let x = 10;
  console.log(x); // 10
}
console.log(x); // 报错:x is not defined

let y = 20;
// let y = 30; // 报错,不能重复声明

 const 声明

const 也是 ES6 中引入的,用于声明常量。它具有以下特点:

  • 作用域constlet 一样,都具有三个作用域。
  • 不可重复声明:同一作用域内不能用 const 重复声明同一个变量。
  • 必须立即赋值:使用 const 声明变量时,必须立即进行赋值,不能留到以后赋值。
  • 不可重新赋值const 声明的变量一旦赋值,就不能再更改其值。但如果 const 声明的是一个对象或数组,虽然不能重新赋值为其它对象或数组,但可以修改其内部的属性或元素。

 

const z = 10;
console.log(z); // 10
// z = 20; // 报错,不能重新赋值

const obj = { name: "Alice" };
obj.name = "Bob"; // 允许修改对象属性
console.log(obj.name); // Bob

const arr = [1, 2, 3];
arr.push(4); // 允许修改数组元素
console.log(arr); // [1, 2, 3, 4]

7.预解析 

预解析 是 JavaScript 中的一种行为,它指的是变量和函数的声明会在代码执行之前被提升到其作用域的顶部。虽然变量的声明被提升,但变量的赋值不会被提升。这意味着可以在变量声明之前使用它们,但使用的变量的值会是 undefined(对于 var 声明)或抛出 ReferenceError(对于 letconst 声明)。

  1. 变量的预解析

    • 使用 var 声明的变量会被提升,但赋值不会。
    • 使用 letconst 声明的变量会被提升,但在声明之前访问这些变量会导致 ReferenceError。
    • 之所以这样会有区别:这是因为var 变量会被提升到作用域的顶部,并且在提升时会初始化为undefined ,let 和 const 变量虽然也会被提升,但它们在提升时并不会初始化为undefined。
  2. 函数的预解析

    • 函数声明会被完全提升,包括函数体。
    • 注意函数表达式不会被提升。比如 我们的匿名函数就是函数表达式,它不会被提升。下面是一个例子:
// myFunc(); // 报错:TypeError: myFunc is not a function
var myFunc = function() {
  console.log('Hello, Function Expression!');
};

myFunc(); // 输出:Hello, Function Expression!

分析

  • 尝试在函数表达式 myFunc 的声明之前调用它会导致 TypeError,因为只有变量声明被提升,而函数体并未被提升。

 


原文地址:https://blog.csdn.net/Easonmax/article/details/142876247

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!