call、apply和bind

2024-05-25 22:36
文章标签 bind call apply

本文主要是介绍call、apply和bind,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

callapplybind都是JavaScript中函数对象的方法,用于改变函数的this值。

  1. callcall方法接收一个对象和一系列参数,并立即调用函数,将this值设置为提供的对象。例如:
function greet(greeting, punctuation) {console.log(greeting + ', ' + this.name + punctuation);
}
let person = {name: 'Alice'};
greet.call(person, 'Hello', '!'); // 输出 "Hello, Alice!"

这段代码中定义了一个函数greet,并创建了一个对象person。然后,使用call方法调用greet函数,并将this值设置为person对象。

让我们逐行解释这段代码:

  1. function greet(greeting, punctuation) {...}:这是一个函数定义,greet函数接收两个参数:greetingpunctuation

  2. console.log(greeting + ', ' + this.name + punctuation);:这是greet函数的主体,它将greeting, this.namepunctuation连接成一个字符串,并打印到控制台。这里的this是函数运行时的上下文,它的值取决于函数是如何被调用的。

  3. let person = { name: 'Alice' };:这行代码创建了一个对象person,并给它一个属性name,值为Alice

  4. greet.call(person, 'Hello', '!');:这行代码使用call方法调用greet函数,并将this值设置为person对象。call方法的第一个参数是this的值,后面的参数是传递给greet函数的参数。所以,在这个函数调用中,this.name的值是Alicegreeting的值是Hellopunctuation的值是!

因此,这段代码的输出是Hello, Alice!

  1. applyapply方法和call方法类似,但是它接收一个对象和一个数组(或类数组对象),而不是一系列参数。例如:
function greet(greeting, punctuation) {console.log(greeting + ', ' + this.name + punctuation);
}
let person = {name: 'Alice'};
greet.apply(person, ['Hello', '!']); // 输出 "Hello, Alice!"
  1. bindbind方法接收一个对象和一系列参数,并返回一个新的函数,这个新的函数的this值被绑定到提供的对象。这个新的函数可以在以后任何时候调用,而不是立即调用。例如:
function greet(greeting, punctuation) {console.log(greeting + ', ' + this.name + punctuation);
}
let person = {name: 'Alice'};
let greetAlice = greet.bind(person, 'Hello', '!');
greetAlice(); // 输出 "Hello, Alice!"

注意,箭头函数不绑定自己的this值,所以callapplybind方法在箭头函数上无效。

这篇关于call、apply和bind的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002806

相关文章

AutoGen Function Call 函数调用解析(一)

目录 一、AutoGen Function Call 1.1 register_for_llm 注册调用 1.2 register_for_execution 注册执行 1.3 三种注册方法 1.3.1 函数定义和注册分开 1.3.2 定义函数时注册 1.3.3  register_function 函数注册 二、实例 本文主要对 AutoGen Function Call

Python __call__ 用法 作用

当一个对象为可被调用对象时,callable(object)返回为True,否则为False: Python中的对象有可被调用和不可被调用之分。 def func_test():print("func_test run")class class_test():def __init__(self):pass# func_test is callable return Trueprint("fu

Tomcat启动报错:transport error 202: bind failed: Address already in use

Tomcat启动报错:transport error 202: bind failed: Address already in use 了,上网查找了下面这篇文章。也是一种解决办法。 下文来自:http://blog.csdn.net/sam031503/article/details/7037033 tomcat 启动日志报出以下错误:  ERROR: transport err

RAC+ADG apply PSU+PATCH

---环境------ aix rac+adg,off-line方式打补丁 ----读所有patch,及PSU的readme,很重要,特别是patch,可能有的应用patch方法不应----- ----停实例,停服务,停集群,disable集群,杀进程----- [oracle@trsendb1 /]srvctl stop instance -d xxxx -i xxxx [o

【C++学习(28)】通俗一点讲解:std::bind 回调技术

std::bind 是 C++11 标准库中的一个功能,它允许你“绑定”某些参数到一个函数、成员函数或可调用对象上,从而生成一个新的可调用对象。这种新的可调用对象可以稍后被调用,而且其中一些参数已经被预先设置好了。这在回调函数和异步编程中特别有用。 下面我用一个通俗的例子来解释 std::bind 是如何工作的。 假设场景 假设你有一个家庭厨师,他有一个技能叫做“做饭”。做饭需要两个参数:一

jQuery Mobile 的.bind()、.live()和.delegate()之间区别

资料一: live方法是bind方法的变种,其基本功能就同bind方法的功能是一样的,都是为一个元素绑定某个事件,但是bind方法只能给当前存在的元素绑定事件,对于事后采用JS等方式新生成的元素无效,而live方法则正好弥补了bind方法的这个缺陷,它可以对后生成的元素也可以绑定相应的事件。      live方法之所以能对后生成的元素也绑定相应的事件的原因归结在“事件委托”上面,所谓

How to apply streaming in azure openai dotnet web application?

题意:"如何在 Azure OpenAI 的 .NET Web 应用程序中应用流式处理?" 问题背景: I want to create a web api backend that stream openai completion responses. "我想创建一个 Web API 后端,用于流式传输 OpenAI 的完成响应。" How can I apply the f

Jaxb - com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 8 counts of IllegalAnnotationExcepti

一、异常 com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 8 counts of IllegalAnnotationExceptions类的两个属性具有相同名称 "orderName"his problem is related to the following location:at public java.lang.Stri

python并行计算之pool.apply_async()与pool.imap()的异同点

目录 1. 框架和技术概要: 🎨🖥️2. 相似点: 🧩💡3. 不同点: 📊👣4. 使用示例: 😊👨‍💻5. 总结: 🎉 1. 框架和技术概要: 🎨🖥️ multiprocessing 模块中的 pool.apply_async() 与 pool.imap() 都用于并行处理,但它们在使用方式和返回结果上有所不同。 2. 相似点: 🧩💡 并行处理

Qt 错误qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

今天运行程序中有一个从网页下载文件到本地的功能运行输出下列错误         qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error     qt.network.ssl: QSslSocket: cannot call unresolved function TLSv1_client_method