call,apply和bind都是JavaScript中的函数方法,它们都可以改变函数调用时this的指向。不过它们之间各有其特定的使用场景和差异。
call: call()方法接受一个参数列表,这个方法无需改变函数的调用时机,可立即执行函数。常常用来借用别的对象的方法。

func.call(thisArg, arg1, arg2, ...)

apply: apply()方法接受一个包含多个参数的数组,与call()类似,apply()也会立即执行函数。当你不知道要传递给函数多少个参数,或者参数是作为一个数组存在时,apply()非常有用。

func.apply(thisArg, [argsArray])

bind: bind()方法返回一个新的函数,使得这个新函数将this设置为bind()的第一个参数。bind()不会立即执行函数,而是返回一个绑定了正确this值的新函数,这点是bind()和call()、apply()的主要区别。bind()非常适合用在事件监听上。

newFunc = func.bind(thisArg[, arg1[, arg2[, ...]]])

总结一下:
call和apply都是为了解决不同对象之间方法的借用,包括他们的参数列表形式不同之处。
bind是将函数体内this对象绑定为指定对象,返回一个新函数,供日后调用。
apply和call都会立即执行函数,而bind不会。

案例:

        // // 数组连接(concatenate): 使用apply将一个数组添加到另一个数组的末尾。
        let array1 = [1, 2, 3]
        let array2 = [4, 5, 6]
        Array.prototype.push.apply(array1, array2)
        console.log(array1)  // 输出: [1, 2, 3, 4, 5, 6]
        // // 这个例子中,apply方法改变了push方法的上下文并执行它,新的上下文是array1,参数是array2。

        // // // 找到数组中的最大值: 使用apply或者call找到数组中的最大值
        let array = [1, 2, 3, 4, 5]
        console.log(Math.max.apply(null, array)); //5
        // // 在这个例子中,apply方法更改了Math.max的上下文并执行它,通过传递数组作为参数。同样,call也可帮助我们达到同样的效果:
        console.log(Math.max.call(null, ...array)); //5
        // // 这里...array是ES6的语法特性,它将数组转为参数序列。

        // 函数柯里化: bind经常用于函数柯里化。它允许你部分地应用函数,将其余的参数留到函数被实际调用时指定。
        function add(x) {
            return function (y) {
                return x + y
            }
        }
        let add5 = add(5).bind(this);
        console.log(add5(3));
        // 在这个例子中,bind方法创建了一个新的add5函数,它是add(5)的一个固定版本,现在它总是将5作为第一个参数加到其余的参数上。
        // 配合 setTimeout()
        // 在默认情况下,在 setTimeout() 内部,this 关键字将被设置为 globalThis,在浏览器中它是 window 对象。当处理需要将 this 引用类实例的类方法时,你可以显式地将 this 绑定到回调函数,以便保持实例的引用。
        class LateBloomer {
            constructor() {
                this.petalCount = Math.floor(Math.random() * 12) + 1;
            }
            bloom() {
                // 延迟一秒后宣布开花
                // setTimeout(this.declare.bind(this), 1000);
                //你还可以使用箭头函数来实现此目的。
                setTimeout(() => this.declare(), 1000)
            }
            declare() {
                console.log(`l am a beautiful flower with ${this.petalCount} petals!`);
            }
        }

        const flower = new LateBloomer();
        flower.bloom();
function list(...args) {
  return args;
}

function addArguments(arg1, arg2) {
  return arg1 + arg2;
}

console.log(list(1, 2, 3)); // [1, 2, 3]

console.log(addArguments(1, 2)); // 3

// 创建一个带有预设前导参数的函数
const leadingThirtySevenList = list.bind(null, 37);

// 创建一个带有预设第一个参数的函数。
const addThirtySeven = addArguments.bind(null, 37);

console.log(leadingThirtySevenList()); // [37]
console.log(leadingThirtySevenList(1, 2, 3)); // [37, 1, 2, 3]
console.log(addThirtySeven(5)); // 42
console.log(addThirtySeven(5, 10)); // 42
//(最后一个参数 10 被忽略)

为何(最后一个参数 10 被忽略)

当你使用 .bind() 方法绑定一些参数到一个函数时,你实际上是在创建一个新的函数,它具有预设的初始参数。这些预设的参数在绑定时已经确定,它们将在新函数被调用时作为第一批参数传入,后续调用时传入的参数将按顺序排在这些预设参数之后。
在 addThirtySeven 函数的示例中,.bind(null, 37) 创建了一个新函数,其中第一个参数(arg1)被预设为 37。当 addThirtySeven(5) 被调用时,数字 5 被作为第二个参数(arg2),所以函数 addArguments 接收的参数为 37(arg1)和 5(arg2),结果是这两个数相加,即 42。
继续这个例子,当你调用 addThirtySeven(5, 10) 时,尽管你传入了两个参数(5 和 10),由于 addArguments 函数只期望和处理两个参数(arg1和arg2),在绑定时已经预设了第一个参数(arg1)为 37,所以传入的第一个参数(5)实际上会被作为第二个参数(arg2)。第二个参数(10)由于在函数 addArguments 中没有对应的第三个参数接收它,所以会被函数忽略,因此没有起作用。
总结来说,addThirtySeven 函数不会处理超过两个参数的情况,因为它是基于 addArguments 函数的,而 addArguments 只处理两个参数。绑定操作将预设的参数固定在参数列表的前面,超出原函数参数数量的额外参数会被忽略。

        /* bind() 最简单的用法是创建一个函数,无论如何调用,它都会使用特定的 this 值进行调用。
         JavaScript 新手经常犯的一个错误是将一个方法从对象中提取出来,然后再调用,并期望方法中的 this 是原来的对象(比如在回调中传入这个方法)。
         然而,如果不做特殊处理的话,通常会丢失原始对象。使用这个函数加上原始的对象来创建一个绑定函数,巧妙地解决了这个问题:*/

        // 顶级的“this”绑定到“globalThis”。
        this.x = 9;
        const module = {
            x: 81,
            getX() {
                return this.x;
            },
        };

        // 'getX'的‘this’参数绑定到"module"
        console.log(module.getX()); //81

        const retrieveX = module.getX;
        // “retrieveX”的“this”参数在非严格模式下绑定到“globalThis”
        console.log(retrieveX());//9

        // 创建一个新函数“boundGetX”,并将“this”参数绑定到“module”。
        const boundGetX = retrieveX.bind(module);
        console.log(boundGetX());//81

剩余参数语法允许我们将一个不定数量的参数表示为一个数组。

function sum(...theArgs) {
  let total = 0;
  for (const arg of theArgs) {
    total += arg;
  }
  return total;
}

console.log(sum(1, 2, 3));
// Expected output: 6

console.log(sum(1, 2, 3, 4));
// Expected output: 10
function isMobile() {
  // 检查屏幕宽度,假定平板或更大尺寸的设备宽度大于 756px
  if (window.innerWidth > 756) {
    return false;
  }

  // 用户代理关键字列表,可以根据需要增减
  var mobileKeywords = ["Android", "webOS", "iPhone", "iPad", "iPod", "BlackBerry", "IEMobile", "Opera Mini"];

  // 检查用户代理字符串是否包含上述任一关键字
  var userAgent = navigator.userAgent || navigator.vendor || window.opera;
  for(var i = 0; i < mobileKeywords.length; i++) {
    if (userAgent.indexOf(mobileKeywords[i]) > -1) {
      return true;
    }
  }

  // 特别针对Windows平板的检测,因为它们可能在用户代理中不包含上述关键字
  if (/windows phone/i.test(userAgent)) {
    return true;
  }

  // 最后,额外考虑小尺寸的设备可能是手机
  return window.innerWidth <= 756;
}

这个版本的isMobile函数先通过屏幕宽度简单排除大部分非移动设备,然后使用用户代理字符串中特定的关键字来进一步确认。这样,即使是小屏幕的平板或对折设备,在用户代理中没有出现对应的移动设备关键字的情况下,也不会被误判为手机。
由于设备和浏览器环境的不断变化,这种方法仍然不是完全准确的,但它比仅仅基于屏幕尺寸的判断更加灵活和准确些。在实际应用中,可能还需要根据具体情况调整关键字列表或判断逻辑。

Here’s something you don’t expect from your run-of-the-mill mesh office chair. Level up your lumbar support with the new 4-way L-Adapt Lumbar support system that not only goes in-and-out, but also goes up-and-down.

“run-of-the-mill”是一个常见的英语表达,用来形容某物普通、平凡、常见,缺乏特别或引人注目的特征。在描述了一种事物或产品时,如果说它是"run-of-the-mill",意思就是它是平凡的、普通的,与其他同类事物或产品没有什么特别之处,没有什么使其与众不同的地方。

在你的描述中,提到了“something you don’t expect from your run-of-the-mill mesh office chair”,意思是你不会从普通的网格办公椅中预料到这样的特点,也就是说,这个新的4向L-Adapt腰部支撑系统让这把椅子变得与其他常见的办公椅不同,提供了更高级的腰部支撑功能。

在CSS中,flex: 0 0 auto; 是用于设置 Flexbox 布局的属性。这个属性是 flex-grow, flex-shrink, 和 flex-basis 的简写形式。

flex-grow:指定一个弹性项在父容器中沿着主轴的增长系数。如果所有项目的 flex-grow 都为 1,则它们会等分剩余空间。设置为0表示不增长。
flex-shrink:指定一个弹性项在必要时缩小的系数。如果空间不足,该值指定项目相对于其他项目收缩的比例。设置为0表示不收缩。
flex-basis:指定了一个弹性项在交叉轴上的初始大小。可以设置为 auto、长度值(如 px、%)或百分比。
因此,flex: 0 0 auto; 的含义是:

flex-grow: 0:这意味着项目不会在剩余空间中增长,它将占据其自然尺寸。
flex-shrink: 0:项目不会收缩,即使空间不足,它也不会缩小。
flex-basis: auto:项目会基于其自身尺寸在交叉轴方向上占据空间。
这种设置通常用于那些我们希望根据项目内容大小来确定大小的情况,而不希望它们自动扩展或缩小。

////
在CSS的Flexbox布局中,flex: 1 0 0%; 这个属性设置表示了以下含义:

flex-grow: 1:这表示项目可以增长,占据所有剩余空间。如果所有项目都具有相同的 flex-grow 值为1,则它们将平均分配所有可用空间。
flex-shrink: 0:项目不会缩小,即使空间不足,也不会收缩。
flex-basis: 0%:这表明项目在分配空间时会根据父元素的大小进行自动调整,占据初始大小为0%的空间。
综合来看,flex: 1 0 0%; 的作用是让项目可以根据剩余空间进行扩展,但不会被压缩,始终占据0%的基础空间,根据需要平分或拉伸剩余空间。这通常用于创建灵活且平均分配剩余空间的布局。

Posted in CSS.

使用“运行”窗口:

按下Win + R组合键打开“运行”窗口。
输入shell:startup并按下Enter,这将打开系统的启动文件夹。
将程序快捷方式拖放到启动文件夹:

在启动文件夹中,创建一个程序的快捷方式,或者直接将程序的快捷方式从其他位置拖放到启动文件夹。
使用任务管理器:

另一种方法是使用任务管理器来添加启动项目:
右键单击任务栏空白处,选择“任务管理器”。
在任务管理器中,转到“启动”选项卡。
点击“启用”或“禁用”以控制启动项目。
若要添加新项目,点击“更多详细信息”,然后转到“启动”选项卡,点击“新建”来添加需要开机启动的程序。
在注册表中设置(谨慎操作):

如果您熟悉Windows注册表编辑器,也可以通过编辑注册表来添加启动项目。
使用regedit命令打开注册表编辑器,然后导航到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run或HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run。
在右侧窗格中,右键单击空白处,选择“新建” -> “字符串值”,然后设置名称为您想要开机启动的程序,值为程序的路径。

they are the people who respond to emergencies like police, firefighters, EMTs, etc.

First Responders are the Paramedics, usually Fire Department members.

a first responder is someone who are called to an emergency like police officer firefighter etc

zh.hinative.com/questions/3439048