当前位置: 首页 > news >正文

【JavaScript】JavaScript 运行原理

执行上下文

JavaScript引擎会在执行代码之前,会在堆内存中创建一个全局对像:Global Object(GO)

该对象所有的作用域(scope)都可以访问,在浏览器中这个对象就是window;里面会包含Date、Array、StringNumber、setTimeout、setInterval等等;其中还有一个window属性指向自己;

JavaScript 引擎内部有一个执行上下文栈(Execution Context Stack,简称ECS),它是用于执行代码的调用栈。

全局的代码块为了执行会构建一个Global Execution Context(GEC); GEC会被放入到ECS中执行;

GEC被放入到ECS中里面包含两部分内容:

  • 第一部分:在代码执行前,在parser转成AST的过程中,会将全局定义的变量、函数等加入到GlobalObject 中,但是并不会赋值;
    这个过程也称之为变量的作用域提升(hoisting)
  • 第二部分:在代码执行过程中,对变量赋值,或者执行其他的函数;

VO

每一个执行上下文会关联一个VO(Variable Object,变量对象),变量和函数声明会被添加到这个VO对象中。

当全局代码被执行的时候,VO就是GO对象了。

var message = "why"
function foo() {var message = "foo"console.log(message)
}
var num1 = 10
var num2 = 20
var result = num1 + num2
console.log(result)
foo()

全局代码执行前:

image-20250209155122357

全局代码执行后:

image-20250209155406871

AO

VO是一个执行上下文中的概念。
在全局执行上下文中,VO=GO。
在函数执行上线文中,VO=AO。

在执行的过程中执行到一个函数时,就会根据函数体创建一个函数执行上下文(Functional Execution Context,简称FEC),并且压入到EC
Stack中。因为每个执行上下文都会关联一个VO,那么函数执行上下文关联的VO是什么呢?

当进入一个函数执行上下文时,会创建一个AO对象(Activation Object):
这个AO对象会使用arguments作为初始化,并且初始值是传入的参数;
这个AO对象会作为执行上下文的VO来存放变量的初始化;

因此上述的代码,也可以分为函数执行前和函数执行后。

函数执行前:

image-20250209160236170

函数执行后:

image-20250209160451991

作用域链

当进入到一个执行上下文时,执行上下文也会关联一个作用域链(Scope Chain)

作用域链是一个对象列表,用于变量标识符的求值;
当进入一个执行上下文时,这个作用域链被创建,并目根据代码类型,添加一系列的对象;

作用域链:

image-20250209161343495

闭包

定义:一个普通的函数function,如果它可以访问外层作用域的自由变量,那么这个函数和它的作用域的组合就是一个闭包;
从广义的角度来说:JavaScript中的函数+外层作用域都是闭包;
从狭义的角度来说:JavaScript中一个函数,如果有访问外层作用域的变量,那么它的组合是一个闭包;

image-20250209162930081

上图是右边代码的整个执行过程:

第一步:全局代码的执行

在 JavaScript 代码运行时,首先会创建 全局执行上下文(Global Execution Context),并将其压入 执行上下文栈(ECS,Execution Context Stack) 中。

1.1 全局执行上下文(Global Execution Context)

  • 创建阶段

    • 创建

      GO(Global Object,全局对象)

      GO = {height: undefined,outer: function outer() {...}, // 赋值函数引用fn: undefined
      }
      
    • this 指向 window(浏览器环境)或 globalThis(Node.js 环境)。

    • 建立作用域链:ScopeChain = [GO]

  • 执行阶段

    • var height = 1.88GO.height = 1.88
    • 声明 function outerGO.outer 指向 outer 函数的内存地址。
    • var fn = outer() 执行 outer()

第二步:执行 outer()

outer() 被调用时,会创建一个新的 执行上下文(outer Execution Context),并压入 执行上下文栈(ECS)

2.1 outer() 执行上下文

  • 创建阶段

    • 创建

      AO(活动对象,Activation Object)

      AO = {age: undefined,inner: function inner() {...} // 赋值函数引用
      }
      
    • 作用域链:ScopeChain = [AO, GO]

    • this 指向 window(浏览器环境)。

  • 执行阶段

    • var age = 18AO.age = 18
    • 声明 function innerAO.inner 指向 inner 函数的内存地址。
    • return innerouter() 返回 inner 的引用,赋值给 fn

由于 inner 被返回,outer() 退出,但 inner 的作用域链仍然保留 AO,形成 闭包

  • 执行上下文栈状态

    ECS:
    1. 全局执行上下文(Global Execution Context)
    

第三步:执行 fn()

此时 fn === inner,所以 fn() 实际上执行的是 inner()

3.1 inner() 执行上下文

  • 创建阶段

    • 创建

      AO(活动对象)

      AO = {name: undefined
      }
      
    • 作用域链:ScopeChain = [AO, outer.AO, GO]

    • this 指向 window(浏览器环境)。

  • 执行阶段

    • var name = "why"AO.name = "why"

    • console.log(name, age, height)

      • nameinner()AO 中找到,值为 "why"
      • ageinner()AO 中找不到,向上在 outer()AO 中找到,值为 18
      • heightinner()outer()AO 中找不到,向上在全局对象 GO 中找到,值为 1.88
    • 输出结果

      why 18 1.88
      

总结

1. 执行上下文栈(ECS)的变化

  1. 执行 outer()

    ECS:
    1. Global Execution Context
    2. outer Execution Context
    
  2. outer() 返回 inner 后,outer 退出

    ECS:
    1. Global Execution Context
    
  3. 执行 fn(),即 inner()

    ECS:
    1. Global Execution Context
    2. inner Execution Context
    
  4. inner() 运行完毕后,退出

    ECS:
    1. Global Execution Context
    

2. 作用域链(Scope Chain)

  • inner() 的作用域链

    [inner.AO, outer.AO, GO]
    
  • 变量查找顺序

    1. nameinner.AO 中找到。
    2. ageinner.AO 中找不到,向上查找 outer.AO,找到 age = 18
    3. heightinner.AOouter.AO 都找不到,向上查找 GO,找到 height = 1.88

3. this 指向

  • outer()inner() 中的 this 均指向 window(浏览器)或 globalThis(Node.js)。

4. 闭包

  • fn() 实际上就是 inner,它仍然能访问 outer() 作用域中的 age 变量,因为 inner() 的作用域链包含 outer.AO

  • inner() 形成了闭包,因为它在 outer() 作用域执行完毕后,仍然能访问 outer() 的变量,也正因为后续不需要执行 fn,但是 fn 对 inner 存在引用,inner 又对 AO1 存在引用,故内存不会被释放,造成内存泄漏。

  • 解决内存泄漏:将 fn = null ;

image-20250209172936226

image-20250209173235143

AO 对象不会被销毁时,里面的没有用到的属性会被释放。

变量提升笔试题

// 1.
var n = 100
function foo() {n = 200
}
foo()
console.log(n) // 200// 2.
function foo() {console.log(n) // undefined 因为自身作用域链中n为undefinedvar n = 200console.log(n) // 200
}
var n = 100
foo()// 3.
var n = 100
function foo1() {// 作用域链是定义时确定 而不是调用时确定console.log(n) // 100 foo1的作用域链:[foo1AO, GO]
}
function foo2() {var n = 200console.log(n) // 200foo1()
}
foo2()
console.log(n) // 100// 4.
var a = 100
function foo() {console.log(a) // undefinedreturnvar a = 100
}
foo()// 5.
function foo() {var a = b = 100// 相互于// var a = 100 // 该函数 AO 中// b = 100 // 全局对象 GO 中(js自带的问题)
}
foo()
console.log(a) // 报错
console.log(b) // 100

新的 ECMA 代码执行描述(ES6)

在之前学习JavaScript代码执行过程(ECMAScript 3)中,我们学习了很多ECMA文档的术语:

执行上下文栈:Execution Context Stack,用于执行上下文的栈结构;
执行上下文:Execution Context,代码在执行之前会先创建对应的执行上下文;
变量对象:Variable Object,上下文关联的VO对象,用于记录函数和变量声明;
全局对象:Global Object,全局执行上下文关联的VO对象;
激活对象:Activation Object,函数执行上下文关联的VO对象;
作用域链:scope chain,作用域链,用于关联指向上下文的变量查找;

现在新的 ECMA(ES6) 中只有执行上下文和执行上下文栈还保持原有说法,其他的说法都变了。以下是最新的说法。

词法环境是一种规范类型,用于在词法嵌套结构中定义关联的变量、函数等标识符;

一个词法环境是由环境记录(Environment Record)和一个外部词法环境(outer Lexical Environment)组成;
一个词法环境经常用于关联一个函数声明、代码块语句、try-catch语句,当它们的代码被执行时,词法环境被创建出来;

ES6开始,执行一个代码,会关联的词法环境是:LexicalEnvironment 和 VariableEnvironment 。

LexicalEnvironment 用于处理 let、const 声明的标识符。
VariableEnvironment 用于处理 var 和 function 声明的标识符。

image-20250209175115992

环境记录:声明式环境记录和对象环境记录。

声明式环境记录:声明性环境记录用于定义ECMAScripti语言语法元素的效果,如函数声明、变量声明和直接将标识符绑定与ECMAScript 语言值关联起来的Catch子句(比如 const let var function )。
对象式环境记录:对象环境记录用于定义ECMAScript 元素的效果,例如 WithStatement 将标识符绑定与某些对象的属性关联起来(with语句)。

image-20250209175544233

ES2025 的说法

LexicalEnvironment 和 VariableEnvironment 这两个组件"始终是环境记录(Environment Records)”,意味着不再通过其他结构(如词法环境)间接管理标识符的绑定。

全局执行上下文关联的是一个全局环境记录 Global Environment Record ,包含一个声明环境记录(let const)和一个对象环境记录(var function),全局环境记录的[[OuterEnv]] 指向 null,表明自己是作用域链的最外层。

image-20250209180356957

查找顺序:在查找一个变量名N时:

首先会在Declarative Environment Record中查找。
若Declarative Environment Record中存在该绑定,则直接返回true,即查找成功。
如果Declarative Environment Record中没有找到该绑定,才会继续在Object Environment Record中查找。

函数环境记录(Function Environment Record)是声明式环境记录(Declarative Environment Record)

这意味着在函数的执行过程中,只会有一个环境记录,这个环境记录就是声明式环境记录。

那么一个声明式环境记录(Declarative Environment Record)是如何区分函数中存放的var变量、Iet/consti这些的呢?

CreateMutableBinding:用于创建var变量的可变绑定
CreateImmutableBinding:用于创建let和const变量的不可变绑定。

  • 不可变绑定指的是一旦这个绑定(也就是这个名字到这个变量的关联)被创建后,它的绑定关系是不可改变的。
  • 具体来说,一旦通过CreateImmutableBinding创建了绑定,你不能用同样的名字再次创建另一个绑定,且在初始化,之前,不能访问或修改这个绑定。

image-20250210100140221

变量提升面试题

概念:变量提升(Hoisting)是 JavaScript 中的一个行为,它使得函数声明和变量声明(使用var关键字声明的变量)在代码执行前被提前到其作用域的顶部。

这意味着无论声明实际上出现在何处,都会被视为在当前作用域的开始处声明:
需要注意的是,仅仅是声明被提升,初始化或赋值仍然会在代码中声明的位置执行。

原因:

  1. 变量提升的存在主要是由于 JavaScript 的解释特性决定的。
  2. 在到 JavaScript 早期版本中,解释器会通过两个阶段处理代码:编译阶段和执行阶段。
  3. 在编译阶段,解释器会先读取并处理所有的声明,而在执行阶段,才会处理实际的逻辑代码。
  4. 这种设计使得在同一作用域内的变量和函数可以在声明之前被引用,从而提供了一定程度的灵活性。

但这也是 js 语言的设计缺点,导致代码运行结果不直观。因此后面我们更多的使用 const let 来声明变量,他们不会发生变量提升。

变量提升的缺陷:

  1. 变量覆盖问题:在同一作用域内,如果不小心重复声明变量,由于变量提升,后面的声明会覆盖前面的声明(尽管实际赋值不会被提升)

    这可能会导致调试时难以发现错误,因为没有直接的错误提示。(在早期的avaScript开发中经常出现)

  2. 意外行为:如果某坐开发者不了解变量提升的机制,可能会误以为变量的赋值也被提升了,这可能导致逻辑上的错误。

  3. 函数声明的混淆:函数提升意味着函数声明可以在函数实际定义之前调用。

    如果在同一作用域内有多个同名函数,可能导致预期外的函数版本被执行,因为后声明的函数会提升会覆盖之前的版本。

  4. 可读性和维护性降低:变量提升可能导致代码的逻辑难以理解。

    因为变量和函数可以在声明之前被引用,这使得在阅读代码时难以立即识别变量的定义位置和作用域,增加了追踪变量声明位置的难度。

作用域和闭包面试题

作用域(Scope)是编程中一个非常重要的概,念,它描述在代码中定义变量的区域,这个区域决定了变量的可访问性和生命周期。简单来说,就是作用域定义了代码块中变量的访问权限。
在 JavaScript 中,作用域控制着变量和函数的可见性以及它们可以被访问的部分。

在 JavaScript 中有如下几种常见的作用域类型:

  1. 全局作用域(Global Scope):当变量在代码中的任何函数外部声明时,它就拥有全局作用域。这意味着任何代码的任何部分都可以访问这些全局变量。全局作用域的变量在页面关闭前一直存在,并且过多的全局变量可能导致命名冲突和维护困难问题。
  2. 函数作用域(Function Scope):在函数内部声明的变量具有函数作用域,这意味着这些变量只能在函数内部被访问。函数参数也具有函数作用域。
  3. 块级作用域(Block Scope):使用Iet和const声明的变量具有块级作用域,即这些变量仅在其包含的 {} 块中可见。这是ES6的新增特性,对于管理局部变量非常有用,尤其是在循环和条件语句中。
  4. 模块作用域(Module Scope):在ES6模块中,顶层声明的变量、函数、类等不是全局的,而是模块内部的。这些声明只在模块内部可见,除非被导出。

作用域链(Scope Chain)是 JavaScript 中的一个基本概念,它用于确定当前执行代码的上下文中变量的查找和访问机制。

  1. 作用域链的构建基于词法作用域的结构,即变量和函数的可见性由它们在源代码中的位置决定。

  2. 在 JavaScript 中,每个执行上下文(如函数执行上下文) 都有一个与之关联的作用域链。

  3. 这个作用域链是一个包含多个环境记录(Environment Record)的列表。

  4. 当前执行上下文的环境记录在链的最前端,如果当前作用域中没有找到某个变量,解释器就会沿着作用域链向上查找,直到达到全局作用域。如果全局作用域中也没有找到,则会产生一个引用错误。

作用域链使得函数可以记住并访问它被定义时的作用域,即使该函数在不同的上下文中被调用。这是闭包(Closures)的核心原理和前提。

闭包是一个函数+外层作用域环境形成了闭包。在 JavaScript 中,每当我们创建一个函数,闭包也会在函数创建的同时被创建出来,这是广义的定义;而狭义的定义就是当我们需要在函数内部访问外部作用域的自由变量,可以直接访问到,就形成了闭包。

闭包存在的原因:
如果没有闭包,那么访问外层作用域中的变量就会受到非常多的限制,也非常的不方便。

  1. 闭包的存在就让我们可以非常自然的访问外层作用域中的变量,不需要通过参数传递进来。
  2. 那么就会造成很多函数的参数是非常繁多和庞杂的,函数本身会变得非常复杂和难以维护。
  3. 那么之后的代码会造成非常的混乱,代码的可维护性、可扩展性、可读性都会变差。

开发中闭包的使用和遇到的问题:

如果不了解闭包的原理的话就容易造成内存泄露。

  1. 比如我们通过一个内层函数引用了外层作用域函数的 AO 或者ER(环境记录),而之后不再使用该内层函数时,我们需要将其置为null。
  2. 如果没有进行这样的操作,很容易造成内存的世漏,因为AO或者ER被长期引用着而无法得到释放。
  3. 这个时候我们应该让开发组员在平时开发的时候就养成良好的编码习惯,并且进行codreview来保证代码质量。
  4. 因为内存优化或者性能优化不是一蹴而就的,它往往需要我们平时开发时就多注意,一旦真正遇到了大的性能问题再亡羊补牢,往往为时已晚。
  5. 代码优化起来就会非常的困难,并且很难重构。

代码执行过程面试题

执行上下文(Execution Context)是JavaScript执行过程中最重要的概念之一。它指的是在代码执行时,JavaScript引擎所创建的一种“环境”。

执行上下文的类型:

  1. 全局执行上下文(Global Execution Context): 在JavaScript程序运行时创建的默认上下文。它包含全局对象(在浏览器中是window对象)和this关键字。
  2. .函数执行上下文(Function Execution Context):每当一个函数被调用时,会创建一个新的执行上下文。每个函数都有自己的执行上下文,包含函数的局部变量、参数、以及内部函数声明。

在执行过程中会创建很多的内容,比如 VO、Scope Chain、this绑定,或者VE、LE、ER(具体解释它们是做什么的)。

执行上下文如何影响JavaScript代码的执行?

  1. 当JavaScript引l擎开始执行一段代码时,首先会创建一个执行上下文。在这个阶段,变量和函数声明会被提升(Hoisting), 即它们会在代码执行前被放入变量对象中。var声明的变量会被初始化为undefined,而let和const变量则不会被初始化。
  2. 在执行阶段,JavaScript引擎会按照代码的顺序逐行执行。变量会被赋予实际的值,函数会被调用。执行上下文在此过程中保持对当前作用域链的跟踪,以便在需要时解析标识符。
  3. JavaScript引擎使用一个栈来管理多个执行上下文。当全局代码开始执行时,全局执行上下文被推入栈顶。当调用函数时,会为该函数创建一个新的函数执行上下文,并推入栈顶。函数执行完毕后,其执行上下文会从栈中弹出,控制权返回到之前的上下文。

JavaScript 代码执行过程:(ES3, ES6, ES2025)

  1. 创建全局对象
  2. 全局对象执行
  3. 函数代码执行

JavaScript 执行过程中的一些术语:

  1. AO Activation Object
    激活对象(Activation Object)是一个较老的术语,用于表示函数执行上下文中的变量对象(Variable Object,VO)。在现代ECMAScript规范中,AO已经被VO取代,但它们本质上指的是同一个概念。

作用:它存储了函数内部声明的所有变量、函数声明和参数。每当函数被调用时,都会创建
一个新的激活对象。

  1. GO Global Object
    全局对象(Global Object)是在全局执行上下文中创建的对象。浏览器环境下的全局对象是window, 在Node.js环境下是global。

作用:GO包含了全局范围内的所有变量和函数声明,此外还包括一些内置对象(如 Math、Date)和全局函数(如setTimeout、parselnt)。

  1. VO Variable Object
    变量对象(Variable Object,Vo)是一个执行上下文中的抽象概念,它包含了函数或全局作用域内声明的变量、函数声明和参数。VO是在执行上下文创建阶段构建的。

作用:在全局执行上下文中,VO是全局对象(GO); 在函数执行上下文中,VO是激活对象(AO)。

  1. LE Lexical Environment
    词法环境(Lexical Environment,LE)是ECMAScript标准中的一个结构,用来存储变量和函数声明的环境。词法环境由两个部分组成:环境记录(Environment Record,ER)和对外部环境的引用(即outer环境)。

作用:LE用来跟踪代码执行期间的标识符和它们的绑定。在代码执行过程中,词法环境被用于确定变量和函数在作用域链中的位置。

  1. VE Variable Environment
    变量环境(Variable Environment,VE)与词法环境类似,但专门用于追踪var声明的变量。与词法环境不同的是,变量环境仅用于存储var声明,而不包括let和const。.

作用:在函数的执行上下文中,VE记录了所有var声明的变量,并且这些变量具有函数作用域。

  1. ER Environment Record
    环境记录(Environment Record,ER)是词法环境和变量环境的组成,用来存储变量、函数声明以及它们的绑定关系。

作用:ER包含了关于当前环境中所有标识符(变量名和函数名)及其对应值的记录。ER可以是声明式环境记录(Declarative Environment Record), 用于存储普通变量和函数,也可以是对象环境记录(Object Environment Record), 用于处理像with语句这样的情况。

var const let 面试题

都是用于声明变量(标识符)的关键字。

  1. 作用域(Scope)
  • var:声明的变量具有函数作用域,即在整个包含函数内部都可见。如果在函数外部使用var声明变量,该变量具有全局作用域。
  • Iet和const:这两者声明的变量具有块级作用域(block scope), 即只在包含它们的代码块(由花括号{}界定)内部可见。
  1. 提升(Hoisting)
  • var:变量提升发生在var声明的变量上,这意味着无论在函数的哪个位置声明变量,变量都会被视为在函数顶部声明(但不初始化,如果提前使用,则值为undefined)。
  • let和const: 虽然技术上也会提升,但它们被限制在一个称为“暂时性死区”(Temporal Dead Zone,TDZ)的区域,直到实际的代码行被执行并且变量被声明。在声明之前访问这些变量会导致ReferenceError。
  1. 重新赋值
  • var和Iet:使用这两个关键字声明的变量可以在后续被重新赋值。
  • const:声明的变量必须在声明时初始化,并且一旦赋值后不能被重新赋值。尝试改变const 变量的值会导致运行时错误。
  1. 重新声明
  • var 在相同的作用域内可以多次声明同一个变量,后面的声明会覆盖前面的声明。
    r:声明的变量具有函数作用域,即在整个包含函数内部都可见。如果在函数外部使用var声明变量,该变量具有全局作用域。
  • Iet和const:这两者声明的变量具有块级作用域(block scope), 即只在包含它们的代码块(由花括号{}界定)内部可见。
  1. 提升(Hoisting)
  • var:变量提升发生在var声明的变量上,这意味着无论在函数的哪个位置声明变量,变量都会被视为在函数顶部声明(但不初始化,如果提前使用,则值为undefined)。
  • let和const: 虽然技术上也会提升,但它们被限制在一个称为“暂时性死区”(Temporal Dead Zone,TDZ)的区域,直到实际的代码行被执行并且变量被声明。在声明之前访问这些变量会导致ReferenceError。
  1. 重新赋值
  • var和Iet:使用这两个关键字声明的变量可以在后续被重新赋值。
  • const:声明的变量必须在声明时初始化,并且一旦赋值后不能被重新赋值。尝试改变const 变量的值会导致运行时错误。
  1. 重新声明
  • var 在相同的作用域内可以多次声明同一个变量,后面的声明会覆盖前面的声明。
  • Iet和const:在相同的作用域或块级作用域内不允许重新声明已经存在的变量。尝试这样做将会导致语法错误。

相关文章:

【JavaScript】JavaScript 运行原理

执行上下文 JavaScript引擎会在执行代码之前,会在堆内存中创建一个全局对像:Global Object(GO) 该对象所有的作用域(scope)都可以访问,在浏览器中这个对象就是window;里面会包含Date、Array、StringNumber、setTimeout、setInte…...

力扣hot100刷题第一天

哈希 1. 两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意…...

数据结构-find()-判断字符串s1中是否包含字符串s2

find()库函数 #include <iostream> using namespace std;bool check(string s1,string s2){int n s1.size();int m s2.size();if(n0||m0 || n<m){return false;}if(s1.find(s2) ! string::npos){return true;}else{return false;} }int main () {string a "…...

寒假2.7

题解 web&#xff1a;[HCTF 2018]WarmUp 打开是张表情包 看一下源代码 访问source.php&#xff0c;得到完整代码 代码审计 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.p…...

【韩顺平linux】部分上课笔记整理

整理一下一些韩顺平老师上课时候的笔记 课程&#xff1a;【小白入门 通俗易懂】韩顺平 一周学会Linux linux环境&#xff1a;使用阿里云服务器 笔记参考 &#xff1a; [学习笔记]2021韩顺平一周学会Linux 一、自定义函数 基本语法 应用实例&#xff1a; 计算两个参数的和…...

Linux proc虚拟文件系统

文章目录 简介proc常用节点pid节点procfs接口参考 简介 测试环境&#xff1a;Linux dev-PC 5.18.17-amd64-desktop-hwe #20.01.00.10 SMP PREEMPT_DYNAMIC Thu Jun 15 16:17:50 CST 2023 x86_64 GNU/Linux proc虚拟文件系统是linux内核提供的一种让用户和内核内部数据结构进行交…...

IDEA中常见问题汇总

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

Spring Security 学习大纲

Spring Security 系统学习大纲 一、基础入门 Spring Security 概述 安全框架的核心功能&#xff08;认证、授权、攻击防护&#xff09;核心组件&#xff1a;SecurityFilterChain, UserDetailsService, AuthenticationProvider, AccessDecisionManager与 Servlet 容器的集成原理…...

本地部署模型全攻略阶段二_3---Kiln AI

Kiln AI && Ollma && DeepSeek Kil AI:简单介绍与入门教程Kiln AI简介核心功能优势与特点二、Kiln AI安装步骤下载安装创建项目和任务使用界面Fine Tuning三、资源与支持Kil AI:简单介绍与入门教程 Kiln AI简介 简述Kiln AI是什么 Kiln AI是一款开源的AI开发…...

从零开始:使用Jenkins实现高效自动化部署

在这篇文章中我们将深入探讨如何通过Jenkins构建高效的自动化部署流水线&#xff0c;帮助团队实现从代码提交到生产环境部署的全流程自动化。无论你是Jenkins新手还是有一定经验的开发者&#xff0c;这篇文章都会为你提供实用的技巧和最佳实践&#xff0c;助你在项目部署中走得…...

机器学习 - 线性回归(最大后验估计)

最大似然估计的一个缺点是当训练数据比较少时会发生过拟合&#xff0c;估计的参数可能不准确.为了避免过拟合&#xff0c;我们可以给参数加上一些先验知识. 一、先从最大似然估计的一个缺点入手 最大似然估计&#xff08;MLE&#xff09;在处理小样本数据时&#xff0c;容易发…...

Web前端开发--HTML

HTML快速入门 1.新建文本文件&#xff0c;后缀名改为.html 2.编写 HTML结构标签 3.在<body>中填写内容 HTML结构标签 特点 1.HTML标签中不区分大小写 2.HTML标签属性值中可以使用单引号也可使用双引号 3.HTML语法结构比较松散&#xff08;但在编写时要严格一点&…...

Linux | 系统调用

文章目录 Linux | 系统调用open 系统调用功能头文件和函数原型参数解释返回值示例代码 其他常用系统调用read 系统调用write 系统调用close 系统调用lseek 系统调用stat 系统调用 Linux | 系统调用 前言&#xff1a;在Linux系统中&#xff0c;系统调用是用户空间程序与内核进行…...

用easyExcel如何实现?

要使提供的 ExcelModelListener 类来解析 Excel 文件并实现批量存储数据库的功能&#xff0c;需要结合 EasyExcel 库来读取 Excel 数据。具体来说&#xff0c;可以使用 EasyExcel.read() 方法来读取 Excel 文件&#xff0c;并指定 ExcelModelListener 作为事件监听器。 下面是…...

ASP.NET Core SignalR身份验证

在需要登录才能访问的集线器类上或者方法上添加[Authorize]。也支持角色等设置&#xff0c;可以设置到Hub或者方法上。 配置好User、Role、MyDbContext、JWTSettings、IdentityHelper Program.cs using SignaIR的基本使用; using Scalar.AspNetCore; using Identity框架; us…...

查询语句来提取 detail 字段中包含 xxx 的 URL 里的 commodity/ 后面的数字串

您可以使用以下 SQL 查询语句来提取 detail 字段中包含 oss.kxlist.com 的 URL 里的 commodity/ 后面的数字串&#xff1a; <p><img style"max-width:100%;" src"https://oss.kxlist.com//8a989a0c55e4a7900155e7fd7971000b/commodity/20170925/20170…...

linux本地部署deepseek

目录 安装ollama安装open-webui网页客户端界面本地安装open-webui直接安装在裸机上安装在docker中 外部服务器安装open-webui&#xff0c;并链接本地的ollama服务直接安装在外部服务器裸机上配置systemd启动open-webui 安装在docker中 最后更新时间2024-05-24 安装ollama olla…...

ESP32_H2(IDF)学习系列-蓝牙基础学习(上)

一、简介 参考&#xff1a;[乐鑫-蓝牙] Bluetooth LE 的分层架构 Bluetooth LE 协议定义了三层软件结构&#xff0c;自上而下分别是 应用层 (Application Layer) 应用层&#xff08;Application Layer&#xff09; 主机层 (Host Layer) 控制器层 (Controller Layer) 应用…...

防御综合实验

需求一 配置vlan [SW2]int g 0/0/2 [SW2-GigabitEthernet0/0/2]port link-type access [SW2-GigabitEthernet0/0/2]port default vlan 10 [SW2-GigabitEthernet0/0/2]int g0/0/3 [SW2-GigabitEthernet0/0/3]port link-type access [SW2-GigabitEthernet0/0/3]port default vl…...

Blazor-<select>

今天我们来说说<select>标签的用法&#xff0c;我们还是从一个示例代码开始 page "/demoPage" rendermode InteractiveAuto inject ILogger<InjectPage> logger; <h3>demoPage</h3> <select multiple>foreach (var item in list){<…...

zy.21

PHP(续) PHP代码执行漏洞 1.PHP中代码漏洞的概念 代码执行漏洞就是在代码中若存在eval、assert等能将所接收的参数作为代码去执行,并且拼接的内容可被访问者控制,也就是把传入的参数给拼接进去了,造成了额外的代码执行,也就造成了代码执行漏洞。&#xff08;大概原理&#x…...

【c++】四种类型转换形式

【c】四种类型转换形式 编译时: static_cast&#xff08;静态转换&#xff09; const_cast&#xff08;去常性转换&#xff09; reinterpret_cast&#xff08;重新解释转换&#xff0c;直接转换地址&#xff09; 运行时: dynamic_cast&#xff08;动态转换&#xff0c;运行时类…...

在npm上传属于自己的包

最近在整理代码&#xff0c;上传到npm方便使用&#xff0c;所以学习了如何在npm发布一个包&#xff0c;整理写成一篇文章和大家一起交流。 1、注册npm账号 npm | Home 2、确保是登录状态 &#xff08;在包目录下&#xff0c;终端执行 npm login) 按enter键自动打开页面&…...

关系型数据库主备高可用方案对比笔记

目录标题 数据库高可用性解决方案对比Oracle Data GuardMySQL 主从复制SQL Server AlwaysOnPG Patroni 流复制达梦 DMDataWatch人大金仓 repmgr 备库故障是否影响主库&#xff1f;表格关系型数据库主备高可用方案对比笔记 数据库高可用性解决方案对比 Oracle Data Guard Orac…...

怎么查看电脑显存大小(查看电脑配置)

这里提供一个简单的方法查看 winr打开cmd 终端输入dxdiag进入DirectX 点击显示查看设备的显示内存&#xff08;VRAM&#xff09; 用这个方法查看电脑配置和显存是比较方便的 dxdiag功能 Dxdiag是Windows的DirectX诊断工具&#xff0c;其主要作用包括但不限于以下几点&#…...

深入理解指针(二)

深入理解指针&#xff08;二&#xff09; 前言&#xff1a;一、const修饰指针1.const修饰变量2.const修饰的指针变量 二、野指针1.野指针的成因(1).指针的未初始化(2).指针的越界访问(3).指针的空间释放 2.如何规避野指针(1).指针初始化(2).小心访问越界(3)指针不再使用的时候&…...

非华为电脑制作一碰传NFC贴纸

前提&#xff1a; 在笔记本上安装好华为电脑管家&#xff0c;可以在 github 上下载&#xff0c;并测试可以正常和手机或平板连接步骤&#xff1a; 1、打开电脑华为电脑管家&#xff0c;点【快捷服务】&#xff0c;记录下序列号&#xff0c;一般安装后会生成16位的序列号 2、…...

Wpf美化按钮,输入框,下拉框,dataGrid

Wpf美化按钮&#xff0c;输入框&#xff0c;下拉框&#xff0c;dataGrid 引用代码后 引用资源 <ControlTemplate x:Key"CustomProgressBarTemplate" TargetType"ProgressBar"><Grid><Border x:Name"PART_Track" CornerRadius&q…...

Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…...

【深度学习】多目标融合算法(四):多门混合专家网络MMOE(Multi-gate Mixture-of-Experts)

目录 一、引言 二、MMoE&#xff08;Multi-gate Mixture-of-Experts&#xff0c;多门混合专家网络&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、…...

git submodule使用

git submodule 用于关联其他独立的仓库。 它有着几点好处&#xff1a; 代码复用&#xff1a;可以将工具代码放到单独的仓库&#xff0c;再通过 submodule 关联。模块化开发&#xff1a;可以将项目拆分成多个模块&#xff0c;每个模块设置单独仓库独立开发&#xff0c;再通过 su…...

朝天椒USB服务器:解决加密狗远程连接

本文探讨朝天椒USB服务器用Usb Over Network技术&#xff0c;解决加密狗在虚拟机、云主机甚至异地的远程连接问题。 在企业数字化转型的浪潮中&#xff0c;加密狗作为防止软件盗版的重要手段&#xff0c;广泛应用于各类软件授权场景。然而&#xff0c;随着企业超融合进程不断加…...

[笔记.AI]deepseek-r1的不同版本(满血版、蒸馏版、量化)

满血版&#xff1a;是原始的高性能模型&#xff1b; 蒸馏版&#xff08;Distill&#xff09;&#xff1a;是指将大型模型&#xff08;教师模型&#xff09;的知识转移到较小的模型&#xff08;学生模型&#xff09;中&#xff0c;以保持性能的同时减少计算资源的需求&#xff1…...

Kokoro 开源文本转语音引擎上线!多语言支持,无需联网,浏览器内极速运行

Kokoro 是一款轻量级的开源文本转语音(TTS)引擎,凭借其高效能和轻量化设计,迅速在技术社区中引起关注。本文将详细介绍 Kokoro 的主要特点,并提供在浏览器和 Python 环境中的代码示例,帮助您快速上手。 1. Kokoro:可在浏览器中运行的 TTS 引擎 1.1 简介 Kokoro 是一个…...

Unity 基础编程

在这个练习中将新建unity脚本&#xff0c;控制player的运动与转动&#xff0c;实现用代码检测碰撞与删除物体。 该练习将应用附件中的项目文件&#xff0c;该文件与Unity快速练习的文件是同一个项目文件。 一、构建Player运动脚本 该部分将构建一个在场景中由玩家控制游戏物…...

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞&#xff0c;全称是Remote Code Execution漏洞&#xff0c;翻译成中文…...

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是&#xff0c;本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为&#xff0c;包括但不限于在各类游戏中实施作弊等违规操作。若因违…...

基于微信小程序的博物馆预约系统的设计与实现

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…...

R语言LCMM多维度潜在类别模型流行病学研究:LCA、MM方法分析纵向数据

全文代码数据&#xff1a;https://tecdat.cn/?p39710 在数据分析领域&#xff0c;当我们面对一组数据时&#xff0c;通常会有已知的分组情况&#xff0c;比如不同的治疗组、性别组或种族组等&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 然而&#xff0c;…...

python卷积神经网络人脸识别示例实现详解

目录 一、准备 1&#xff09;使用pytorch 2&#xff09;安装pytorch 3&#xff09;准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1&#xff09;导入库 2&#xff09;数据预处理 3&#xff09;加载数据 4&#xff09;构建一个卷积神经网络 5&#xff0…...

如何把邮件批量导出到本地

最近遇到邮箱满了的问题&#xff0c;需要把邮件批量导出到本地&#xff0c;然后清空邮箱。 问题是这个邮箱的官网&#xff0c;没有批量导出按钮&#xff0c;比较麻烦&#xff1b;总不能一封一封下载到本地&#xff0c;上万的。 找到了一个好用的工具&#xff0c;Mozilla Thun…...

C++智能指针的使用

文章目录 智能指针的使用和原理智能指针的使用场景RAII和智能指针C标准库智能指针的使用 智能指针的使用和原理 智能指针的使用场景 1. 下面的程序中&#xff0c;new了以后&#xff0c;我们也delete了&#xff0c;但是因为抛异常导致后面的delete没有得到执行&#xff0c;所以…...

Docker安装Redis

一、保证Docker提起来了 systemctl status docker想这没有启动要先启动一下 systemctl status docke二、拉取Redis&#xff08;默认拉最新版&#xff09; sudo docker pull redis检查一下拉成功没有 docker images三、创建相关目录 mkdir -p /home/redis/{conf,data}四、…...

深入理解MySQL索引底层数据结构

文章目录 前言一、MySQL索引是什么&#xff1f;二、索引的核心需求三、MySQL为什么选择BTree做为数据结构1.如果使用的是Hash 做为数据结构2.如果使用二叉树做为数据结构3.使用红黑树做为数据结构4.使用B-Tree做为数据结构5.BTree做为数据结构 4.BTree深度剖析结构特性与 B-Tre…...

udp和tcp的区别

目录 UDP 和 TCP 的区别 1. 连接性 2. 可靠性 3. 数据传输顺序 4. 流量控制和拥塞控制 5. 效率 6. 应用场景 UDP 和 TCP 的 C/C 代码实现区别 1. TCP 服务器端和客户端 TCP 服务器端&#xff08;Server&#xff09; TCP 客户端&#xff08;Client&#xff09; 2. U…...

VMware 虚拟机 ubuntu 20.04 扩容工作硬盘

一、关闭虚拟机 关闭虚拟机参考下图&#xff0c;在vmware 调整磁盘容量 二、借助工具fdisk testubuntu ~ $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 3.1M 385M 1% /run /dev/sda5 …...

MapReduce是什么?

MapReduce 是一种编程模型&#xff0c;最初由 Google 提出&#xff0c;旨在处理大规模数据集。它是分布式计算的一个重要概念&#xff0c;通常用于处理海量数据并进行并行计算。MapReduce的基本思想是将计算任务分解为两个阶段&#xff1a;Map 阶段和 Reduce 阶段。 Map 阶段&a…...

跨越边界,大模型如何助推科技与社会的完美结合?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 概述 2024年&#xff0c;大模型技术已成为人工智能领域的焦点。这不仅仅是一项技术进步&#xff0c;更是一次可能深刻影响社会发展方方面面的变革。大模型的交叉能否推动技术与社会的真正融合&#xff1f;2025年…...

计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

RK3568平台开发系列讲解(ConfigFS篇)ConfigFS核心数据结构

🚀返回专栏总目录 文章目录 一、数据结构二、结构体关系三、案例3.1、configfs_subsystem 实例3.2、config_group 实例化四、属性和方法五、config_item实例化沉淀、分享、成长,让自己和他人都能有所收获!😄 理解 ConfigFS 的核心数据结构对于深入使用和定制 ConfigFS 非…...