JavaScript中的闭包、递归问题
一、函数定义和调用
1.函数的定义方式
方式一
函数声明方式 function 关键字(命名函数)
function fn(){}
方式二
函数表达式(匿名函数)
var fn = function(){}
方式三
new Function()
var f = new Function('a','b','console.log(a + b);');//语法
var fn = new Function('参数1','参数2',....,'函数体');
注意:
Function里面参数都必须是字符串格式
第三种方式执行效率很低,也不方便书写,因此较少使用
所有函数都是Function的实例对象
函数也属于对象
2.函数的调用
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>01函数的定义和调用方式</title>
</head>
<body><script>//1.自定义函数(命名函数)function fn(){}//2.函数表达式(匿名函数)var fun = function(){}//3. 利用new Function(('参数1','参数2',....,'函数体');var f = new Function('a','b','console.log(a + b);');f(1,2);//4. 所以的函数都是Function的实例(对象)console.dir(f);//5.函数也属于对象console.log(f instanceof Object);</script>
</body>
</html>
函数的调用
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>02函数的调用</title>
</head>
<body><script>//1.普通函数function fn(){console.log('人生的巅峰');}fn();fn.call();//2.对象的方法var o = {sayHi : function(){console.log('人生的巅峰2');}}o.sayHi(); //对象.函数();//3.构造函数function Star(){}new Star();//4.绑定事件的函数//btn.onclick = function(){} //点击了按钮就可以调用这个函数//5.定时器函数setInterval(function(){},1000);//6.立即执行函数(function(){console.log('hello');})();</script>
</body>
</html>
二、this
1.函数内部的this指向
这些this的指向,是当我们调用函数的时候确定的,调用方式不同决定了this的指向不同。
| 调用方式 | this指向 |
|---|---|
| 普通函数调用 | window |
| 构造函数调用 | 实例对象,原型对象里面的方法也指向了实例对象 |
| 对象方法调用 | 该方法所属的对象 |
| 事件绑定方法 | 绑定事件的对象 |
| 定时器函数 | window |
| 立即执行函数 | window |
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>03this的指向</title>
</head>
<body><button>点击</button><script>//函数的不同调用方式决定了this的指向不同 //1.普通函数this指向window对象function fn(){console.log('普通函数的this--->' + this);}window.fn();//2.对象的方法,this指向的是对象ovar o = {sayHi : function(){console.log('对象方法的this--->' + this);}}o.sayHi(); //对象.函数();//3.构造函数function Star(){}Star.prototype.sing = function(){console.log('构造的this--->' + this);}var ldh = new Star();ldh.sing();//4.绑定事件函数this指向的函数调用者 (比如:btn.onclick 函数中的this指向的btn对象)var btn = document.querySelector('button');btn.onclick = function(){console.log('绑定事件的函数中的this--->' + this);}//5.定时器函数this,指向的就是windowwindow.setTimeout(function(){console.log('定时器函数中的this--->' + this);},1000);//6.立即执行函数 this还是指向window(function(){console.log('立即执行函数this--->' + this);})();</script>
</body>
</html>
2.改变函数内部this指向
2.1 call方法
call() 方法调用一个对象,简单的理解调用函数的方式,但是它可以改变函数this指向
应用场景:经常做继承
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>04改变函数内this指向call方法</title>
</head>
<body><script>//js 中一共是提供了三种方法可以改变this的指向:call() apply() bind()var obj = {name: 'amdin'}function fn(a,b){console.log(this);console.log(a + b);}//1.call() 改变函数this的指向fn.call(obj,1,2);function Father(name,age,sex){this.name = name;this.age = age;this.sex = sex;}function Son(name,age ,sex){//this:指向SonFather.call(this,name,age,sex);}var son = new Son('刘德华',80,'男');</script>
</body>
</html>
2.2 apply方法
apply() 方法调用一个函数。简单的理解为调用函数的方式,但是它可以改变函数的this指向
应用场景:经常跟数组有关系
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>05.改变函数内this指向apply方法</title>
</head>
<body><script>//js 中一共是提供了三种方法可以改变this的指向:call() apply() bind()//2.apply() 方法 应用/运用var obj = {name: 'admin'}function fn(arr){console.log(this);console.log(arr);}fn.apply(obj,['pink','red']);fn(['pink','red'])//1.也是调用函数,第二个可以改变函数内部的this指向//2.但是它的参数必须是数组(伪数组)//3.apply的主要应用比如我们可以利用apply借助于数学内置对象求数组最大值//Max.max();var arr = [1,66,3,99,4];var arr1 = ['red','pink']// var max = Math.max.apply(null,arr);// var min = Math.min.apply(null,arr);var max = Math.max.apply(Math,arr);var min = Math.min.apply(Math,arr);console.log(max);console.log(min);</script>
</body>
</html>
2.3 bind 方法
bind()方法不会调用函数,但是能改变函数内部this指向,返回的是原函数改变this之后产生的新函数。
如果指向改变this指向,并且不想要调用这个函数的时候,就可以用bind
**应用场景:**不调用用户,但是还想改变this指向
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>06.05.改变函数内this指向bind方法</title>
</head>
<body><button>点击</button><button>点击</button><button>点击</button><script>//js 中一共是提供了三种方法可以改变this的指向:call() apply() bind()//2. bind() 意思就是捆绑或绑定var obj = {name:'admin'}function fn(a,b){console.log(this);console.log(a + b);}//fn(1,2);var f = fn.bind(obj,1,2);f();//1)不会调用原来的函数,可以改变原来函数内部的this指向//2)返回的是原函数改变this之后产生的新函数//3)如果有函数我们不需要立即调用,但是又想改变这个函数内部的this指向,此时我们可以bind//4)我们有一个按钮,当我们点击之后,就想用禁用这个按钮,3秒之后开启这个按钮// var btn1 = document.querySelector('button');// btn1.onclick = function(){// this.disabled = true;// //设置定时任务// setTimeout(function(){// this.disabled = false; //定时器函数中this指向的是window对象// }.bind(this),3000); //因为这里的this是写在定时器之外,所以这里的this还是btn这个对象// }var btns = document.querySelectorAll('button');//给每个按钮注册点击事件for(var i = 0; i < btns.length; i++){btns[i].onclick = function(){this.disabled = true;//3秒后按钮重新可以被点击setTimeout(function(){this.disabled = false;}.bind(this),3000);}}</script>
</body>
</html>
2.4 call、apply、bind三者异同
- 共同点
- 都可以改变this的指向
- 不同点
- call和apply会调用函数,并且改变函数内部的this指向
- call和apply传参不一样,call传递参会使用逗号分隔,apply使用数组传参
- bind必会调用函数,可以改变函数内部的this指向
- 应用场景
- call经常做继承
- apply经常跟数组有关系,比如:借助数学对象实现数组最大值和最小值
- bind不调用函数,但是还想改变this的指向,比如:改变定时器内部的this指向
三、严格模式
官网资料地址:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
1.什么是严格模式
Js除了提供正常的模式之外,还提供了严格模式(strict mode)。
ES5的严格模式采用具有限制性js变体的一种方式——即在严格的条件下运行js代码。
严格模式在IE10以上版本浏览器中才会被执行,旧版本浏览器中会被忽略。
严格模式对正常的js语义做了一些修改:
- 清除了js语法的一些不合理、不严谨之处、减少了一些怪异行为
- 清除了js代码运行的一些不安全之处,保证代码的运行安全。
- 提高了编译器的效率,增加运行速度
- 禁用了ECMAScript的未来本版中可能会定义的一些语法,为未来新版本的JS 做了铺垫。比如:一些保留关键字
class、enum、export、extends、import、super不能做为变量
2.开启严格模式
严格模式可以应用到整个脚本或者是个别函数中,因此在使用的时候,我们可以将yan模式分为脚本开启严格模式还是函数开启严格模式两种情况。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>07.开启严格模式</title>
</head>
<body><!-- 为整个脚本(script标签)开启严格模式 --><script>'use strict';// 下面js代码就会按照严格模式执行代码</script><script>// 给某个函数开启严格模式function fn(){'use strict';// 下面js代码就会按照严格模式执行代码}function fn(){'use strict';// 下面js代码就会按照严格模式执行代码}</script><script>(function(){'use strict';// 下面js代码就会按照严格模式执行代码})();</script>
</body>
</html>
2.1 脚本开启严格模式
有的script脚本是严格模式,有的script是正常模式,这样不利于文件的合并,所以可以将整个脚本文件放在一个立即执行函的匿名函数里面,这样独立创建有一个作用域而不影响其它的script脚本文件。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>08.开启严格模式后的变化</title>
</head>
<body><script>'use strict'; //use strict:严格的//1.我们的变量名必须先声明后使用//num = 10; //在严格模式下,变量必须用var声明后才能使用// console.log(num);var num = 10;console.log(num);//2.我们不能随意删除已经声明好变量//delete num; //删除变量num//console.log(num);//3.严格模式下全局作用域中函数的this 是undefinedfunction fn(){console.log(this); //undefined}fn();//4.在严格模式下,如果构造函数不加new调用,this指向的是undefined,如果给它赋值则会报错function Star(){this.sex = '男'}//Star();var ldh = new Star();console.log(ldh.sex);//5.定时器this指向还是windowsetTimeout(function(){console.log(this);},2000);//6.在严格模式下函数里面的参数不允许重名var a = 1;a = 2;// function fn(a,a){ //参数名不允许重复// console.log(a);// }// fn();</script>
</body>
</html>
2.2 为函数开启严格模式
要给某个函数开启严格模式,需要
'use strict';写到函数体所有语句之前
function fn(){'use strict';//....
}//表示当前fn函数开启了严格模式
四、高阶函数
高阶函数:是对其它函数进行操作的函数,它接受函数作为参数或者将函数作为返回值输出。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>09高阶函数</title><style>div{position: absolute;width: 100px;height: 100px;background-color: pink;}</style><script src="animate.js"></script>
</head>
<body><div></div><script>//高阶函数——函数可以作为参数传递function fn(a,b,callback){console.log(a + b);callback && callback();}fn(1,2,function(){console.log('我是最后调用的');})</script>
</body>
</html>
五、闭包
1.变量的作用域【复习】
变量根据作用域的不同分为:全局变量和局部变量
- 函数内部可以使用全局变量
- 函数外部不可以使用局部变量
- 当函数执行完毕后,本作用域内局部变量会被销毁
2.什么是闭包
closure:闭包。指有权访问另一个函数作用域中变量的函数。
简单的理解:一个作用域可以访问另一个函数内部的局部变量
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>//闭包:指有权访问另一个函数作用域中的变量的函数//闭包:我们fun这个函数的作用域,访问了另一个函数fn里面的局部变量numfunction fn(){var num = 10;function fun(){console.log(num);}fun();}fn();</script>
</body>
</html>
3.闭包的作用
作用:延申变量的作用范围
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>11.闭包的作用</title>
</head>
<body><script>//闭包:指有权访问另一个函数作用域中的变量的函数//一个作用域可以访问另一个函数的局部变量//fn外面的作用域可以访问fn内部的局部变量//闭包的主要作用:延申了变量的作用范围function fn(){var num = 10;return function(){console.log(num);};}var f = fn();f();</script>
</body>
</html>
4.闭包案例
4.1 得到li当前的所以那红
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>12.闭包应用-点击li输出索引号</title>
</head>
<body><ul class="nav"><li>星期一</li><li>星期二</li><li>星期三</li><li>星期四</li></ul><script>//闭包//1.我们可以利用动态添加属性的方式给每个li添加索引var lis = document.querySelector('.nav').querySelectorAll('li');// for(var i = 0; i < lis.length; i++) {// lis[i].index = i;// lis[i].onclick = function(){// console.log(i); //表示i是循环中的i// //console.log(this.index);// }// }//2.利用闭包的方式得到每个当前小li的索引号for(var i = 0; i < lis.length; i++){//利用for循环创建了4个立即执行函数//立即执行哈桑农户也为小闭包//立即执行函数为小闭包因为立即执行函数里卖弄的任何一个函数都可以使用它的i这个变量(function(i){lis[i].onclick = function(){console.log(i);}})(i);}</script>
</body>
</html>
4.2 闭包定时器中的应用
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>13.闭包应用-定时器</title>
</head>
<body><ul class="nav"><li>星期一</li><li>星期二</li><li>星期三</li><li>星期四</li></ul><script>// 闭包应用- 3秒钟之后,打印所有li元素的内容var lis = document.querySelector('.nav').querySelectorAll('li');for(var i = 0; i < lis.length; i++){//生成了4个立即执行函数(function(i){setTimeout(function(){console.log(lis[i].innerHTML);},3000);})(i);}</script>
</body>
</html>
4.3 打车价格案例
需求:计算打车价格
//1.打车的起步价13(3公里以内),之后每多一公里增加5块钱,用户输入公里数就可以计算打车的价格
//2.如果有拥堵的情况,总价格多收取10块钱拥堵费
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>14.计算打车的价格</title>
</head>
<body><script>//需求:计算打车价格//1.打车的起步价13(3公里以内),之后每多一公里增加5块钱,用户输入公里数就可以计算打车的价格//2.如果有拥堵的情况,总价格多收取10块钱拥堵费var car = (function(){var start = 13; //起步价,局部变量var total = 0; //总价,局部变量// 返回对象return {//正常的价格price: function(n){ //n是用户打车的距离if(n <= 3){total = start;//小于或等于3公里,就是起步价} else {total = start + (n - 3) * 5;}return total;},//拥堵之后的费用yd:function(flag){ //flag是是否拥堵return flag? total + 10:total;}}})();var total1 = car.price(5);console.log(total1); //23var total2 = car.yd(true);console.log(total2); // 33var total3 = car.price(1); //13var total4 = car.yd(false); //13console.log(total3, total4);</script>
</body>
</html>
六、递归
1.什么是递归
递归:如果一个函数再内部可以调用其本身,那么这个函数他就是递归函数。
简单理解:函数内部自己调用了自己,这个函数就是递归函数
**注意:**递归函数的作用和循环效果一样,由于递归很容易出现(栈移除),所以要加退出的条件
2.求1~n的阶乘
3! = 1 × 2 × 3
5!= 1 × 2 × 3 × 4 × 5
n! = 1 × 2 × … n
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>15.求n的阶乘</title>
</head>
<body><script>//利用递归函数求n的阶乘function fn(n){if(n == 1){ //结束条件return 1;}return n * fn(n - 1);}//n=1 fn(1) = 1;//n=2 fn(2) = 2 * f(1) = 2 * 1;//n=3 fn(3) = 3 * fn(3-1) = 3 * 2 * 1;//n=4 fn(4) = 4 * fn(4-1) = 4 * 3 * 2 * 1;//....console.log(fn(4));console.log(fn(10));</script>
</body>
</html>
3.斐波拉契数列
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>16.斐波拉契数列</title>
</head>
<body><script>//斐波拉契数列: 1 1 2 3 5 8 13 21 34 55....function fb(n){if(n == 1 || n == 2){ //结束条件return 1;}//数的值是前两个数的和return fb(n - 1) + fb(n -2);}//fb(1) = 1//fb(2) = 1//fb(3) = fb(3-1) + fb(3-2) = fb(2) + fb(1) = 1 + 1 = 2//fb(4) = fb(4-1) + fb(4-2) = fb(3) + fb(2) = 2 + 1 = 3//fb(5) = fb(5-1) + fb(5-2) = fb(4) + fb(3) = 3 + 2 = 5//fb(6) = fb(6-1) + fb(6-2) = fb(5) + fb(4) = 5 + 3 = 8//...console.log(fb(10));</script>
</body>
</html>
4.利用递归遍历数据
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>17.利用递归遍历数据</title>
</head>
<body><script>var data = [{id:1,name:'家电',goods:[{id:11,gname:'冰箱',goods:[{id:111,name:'海尔'},{id:222,name:'美的'}]},{id:22,name:'洗衣机',goods:[{id:111,name:'小天鹅'},{id:222,name:'美的'}]}]}];//1.利用foreach遍历里面的每一个对象function getID(json,id){var obj = {}json.forEach(function(item){//console.log(item); //2个数组元素if(item.id == id){ //如果对象的id == 传入的id//console.log(item);obj = item; //将一级分类对象给到自定义对象obj} else if(item.goods && item.goods.length > 0){ //我们想要得到数据11 和 12 可以利用递归函数//里面应该有goods这个数组并且数组长度部位0obj = getID(item.goods,id)} });return obj;}console.log(getID(data,1));console.log(getID(data,11));console.log(getID(data,111));</script>
</body>
</html>
七、浅拷贝和深拷贝
1.浅拷贝
浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>18.浅拷贝</title>
</head>
<body><script>//浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用var obj = {id:1,name:'admin',msg:{age:18}}var o = {};for(var k in obj){//k 是属性名 obj[k] 该属性的值o[k] = obj[k]; //设置对象o属性k的值为obj[k]}// o.msg.age = 20;// console.log(o);// console.log(obj);console.log('---------------------------');//Object.assign(o,obj);o.msg.age = 21;console.log(o);console.log(obj);console.log(o === obj);</script>
</body>
</html>
2.深拷贝
深拷贝拷贝多层,每一级的数据都会拷贝
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>19.深拷贝</title>
</head>
<body><script>//深拷贝拷贝多层,每一级的数据都会拷贝var obj = {id:1,name:'admin',msg:{age:18}}var o = {};//封装函数function deepCopy(newObj,oldObj){for(var k in oldObj){//1.判断我们的属性值属于哪种数据类型//获取属性值var item = oldObj[k]if(item instanceof Array){ //如果是数组newObj[k] = [];deepCopy(newObj[k],item);} else if(item instanceof Object){ //如果是对象newObj[k] = {};deepCopy(newObj[k],item);} else {//属于简单类型newObj[k] = item;}}}deepCopy(o,obj);o.msg.age = 20;console.log(o);console.log(obj);</script>
</body>
</html>
相关文章:
JavaScript中的闭包、递归问题
一、函数定义和调用 1.函数的定义方式 方式一 函数声明方式 function 关键字(命名函数) function fn(){}方式二 函数表达式(匿名函数) var fn function(){}方式三 new Function() var f new Function(a,b,console.log(a b););//语法 var fn new Fu…...
【青牛科技】GC4938替代A4938/Allegro在水泵、筋膜枪、吸尘器和电动工具中的应用
随着技术的不断进步,电机驱动控制器在各类电动设备中的应用越来越广泛。GC4938作为一种新型的电机驱动控制器,逐渐被视为A4938/Allegro的替代品。在这篇文章中,我们将探讨GC4938在水泵、筋膜枪、吸尘器和电动工具等设备中的应用优势和特点。 …...
基于yolov5的输电线,电缆检测系统,支持图像检测,视频检测和实时摄像检测功能(pytorch框架,python源码)
更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: yolov5,输电线(线缆)检测系统,系统既支持图像检测,也支持视频和摄像实时检测【pytorch框架】_哔哩哔哩_bilibili (一)简介 基于yolov5的输…...
uniapp下载文件的方案,包括H5,App方案解决办法
1. 在uniapp需要下载文件,但是显示情况是不能下载。所以只能使用该办法来进行下载。 2. 这有一个注意点是:如果你做的是H5的方案,那么我已经替你踩好坑了,UC浏览器是不支持blob类型的下载,以及创建a标签的方案来进行下…...
c++ 贪心算法
概念 贪心算法是一种在每一步选择中都选择当前最优解的算法策略。这种方法适用于某些特定问题,可以通过局部最优选择构建全局最优解。 特点 局部最优选择:每一步选择都选择当前看起来最优的解。无后效性:当前选择不会影响未来选择的可能性…...
15分钟学 Go 第 35 天:Go的性能调优 (7000字详细教程)
第35天:Go的性能调优 目标:理解Go语言中基本的性能优化,学习如何分析和提高Go程序的执行效率。 一、性能调优概述 性能调优是软件开发中的一个重要环节,它可以确保程序在资源有限的环境下高效运行。Go语言天生具备高效的性能表现…...
6、显卡品牌分类介绍:技嘉 - 计算机硬件品牌系列文章
技嘉科技是一家以主板、显卡在业界缔造无以撼动的地位的科技公司,其核心理念是「技术创新、质量稳定」的高标准。技嘉专注于关键技术研发,其经营范围涵盖家用、商用、电竞等多元科技领域。通过应用突破性的专利技术,技…...
Redis数据类型——针对实习面试
目录 Redis数据类型Redis常用的数据类型有哪些?String类型可以用于哪些场景?Set类型可以用于哪些场景?Bitmaps类型可以用于哪些场景?HyperLogLog类型可以用于哪些场景?Hash类型与Set类型有什么区别?Hash类型…...
roberta融合模型创新中文新闻文本标题分类
项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…...
《密码系统设计》实验二 4-6学时
文章目录 《密码系统设计》实验实验项目实验二 密码算法实现4-6 学时实践要求(30 分)1. 定义宏2. 使用特定的源文件3. 编译MIRACL库4. 配置KCM和Comba方法5. 编译和运行MEX工具6. 使用config.c工具总结1. 准备环境2. 下载和解压MIRACL库3. 定义宏4. 使用…...
Zypher Network:全栈式 Web3 游戏引擎,服务器抽象叙事的引领者
近期,《黑神话:悟空》的爆火不仅让 AAA 游戏重回焦点,也引发了玩家与开发者的热议。Web2 游戏的持续成功导致部分 Web3 玩家们的倒戈,对比之下 Web3 游戏存在生命周期短且商业模式难以明确的问题,尤其在当前加密市场环…...
2025生物发酵展(济南)为生物制造产业注入新活力共谱行业新篇章
2025第十四届国际生物发酵展将于3月3-5日济南盛大举办!产业链逐步完整,展会面积再创历史新高,展览面积较上届增涨至60000平方米,专业观众40000,品牌展商800,同期活动会议增加至50场,展会同期将举…...
git入门教程14:Git与其他工具的集成
一、Git与代码托管平台的集成 GitHub 集成方式: 在GitHub上创建或克隆仓库。在本地使用Git命令进行代码提交和推送(如git push)。GitHub提供Web界面进行代码浏览、协作和持续集成配置。 特点: 支持Pull Request,便于代…...
在Zetero中调用腾讯云API的输入密钥的问题
也是使用了Translate插件了,但是需要调用腾讯云翻译,一直没成功。 第一步就是,按照这上面方法做:百度、阿里、腾讯、有道各平台翻译API申请教程 之后就是:Zotero PDF translat翻译:申请腾讯翻译接口 主要是…...
【AD】1-8 AD24软件工程创建
1.点击文件,新建项目 2.如图进行设置工程名称和文件路径 3.创建原理图库及原理图,并保存 4.新建PCB库及PCB,并保存 5.单击右键工程保存 注意:先新建工程,在新建文件...
RT-Thread学习
文章目录 前言一、rtt的启动流程二、移植工作总结 前言 RT-Thread学习,这里记录对bsp的移植 一、rtt的启动流程 RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺序是:系统先从…...
20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速
20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速 2024/11/2 14:18 客户端:荣耀手机HONOR 70【iPerf2 for Android】 服务器端:荣品PRO-RK3566开发板 预编译固件:update-pro-rk3566-buildroot-hdmi-2…...
网络模型——二层转发原理
网课地址:网络模型_二层转发原理(三)_哔哩哔哩_bilibili 一、路由交换 网络:用来信息通信,信息共享的平台。 网络节点(交换机,路由器,防火墙,AP)介质&#…...
【编程技巧】C++如何使用std::map管理std::function函数指针
一、问题背景 开发过程中遇到了需要根据const字符串调用不同函数的要求。在开发过程中为了快速实现功能,实际使用了if else等判断实现了不同函数的调用,徒增了不少代码行数。 明知道可以采用map管理函数指针,但是没有具体实现过,…...
导航栏小案例
实现类似于这样的效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>导航栏</title><style>*{margin: 0;padding: 0;}.div1{width: 100%;height: 60px;/* border: 1px solid blue; */background-color:rgb(…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
