bind函数(bind函数的用法和参数)

各位老铁们好,相信很多人对bind函数都不是特别的了解,因此呢,今天就来为大家分享下关于bind函数以及bind函数的用法和参数的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

在JavaScript中,函数是一个非常强大的概念,它可以封装逻辑和行为,提高代码的可读性和可维护性。在函数的使用过程中,我们常常会遇到一些场景,比如我们需要在特定上下文中调用一个函数,或者我们需要改变函数中的this指向。这时候,bind函数就派上了用场。本文将深入解析JavaScript中的bind函数,包括其应用场景、使用技巧以及一些案例分析。

一、什么是bind函数?

让我们来了解一下什么是bind函数。bind函数是JavaScript中一个非常有用的内置函数,它可以将一个函数绑定到一个对象上,改变这个函数的上下文环境。简单来说,bind函数可以让函数中的this关键字指向特定的对象。

二、bind函数的应用场景

1. 改变函数的上下文环境

假设我们有一个对象A,里面有一个方法func:

“`javascript

const A = {

func: function() {

console.log(this.name);

}

};

const B = {

name: ‘bind函数’

};

“`

如果我们想在B对象上调用A对象的func方法,并让func方法中的this指向B对象,可以使用bind函数:

“`javascript

const funcBound = A.func.bind(B);

funcBound(); // 输出:bind函数

“`

2. 防止匿名函数中的this指向问题

在事件处理函数或回调函数中,由于JavaScript的运行机制,匿名函数中的this关键字往往指向全局对象(在浏览器中通常是window)。为了避免这个问题,我们可以使用bind函数:

“`javascript

const button = document.getElementById(‘myButton’);

button.addEventListener(‘click’, function() {

console.log(this); // 输出:button元素

});

“`

3. 预设函数参数

在某些场景下,我们需要在函数调用时预设一部分参数。这时,bind函数可以帮助我们实现:

“`javascript

function sum(a, b) {

return a + b;

}

const sumBound = sum.bind(null, 10);

console.log(sumBound(20)); // 输出:30

“`

三、bind函数的使用技巧

1. 避免不必要的函数调用

在使用bind函数时,要注意避免不必要的函数调用。以下是一个例子:

“`javascript

const obj = {

name: ‘bind函数’,

sayName: function() {

console.log(this.name);

}

};

const sayNameBound = obj.sayName.bind(obj);

// 以下调用会导致两次不必要的函数调用

obj.sayName(); // 输出:bind函数

sayNameBound(); // 输出:bind函数

“`

为了解决这个问题,我们可以使用一个自执行函数:

“`javascript

const obj = {

name: ‘bind函数’,

sayName: function() {

console.log(this.name);

}

};

(function() {

obj.sayName();

})();

“`

2. 理解bind函数的返回值

bind函数返回一个新的函数,这个新函数可以接受参数,并在调用时执行原始函数。以下是一个例子:

“`javascript

function sum(a, b) {

return a + b;

}

const sumBound = sum.bind(null, 10);

console.log(sumBound(20)); // 输出:30

// 等价于以下代码

const sumBound = function(b) {

return sum(10, b);

};

“`

四、案例分析

1. 使用bind函数实现表单验证

以下是一个使用bind函数实现的简单表单验证示例:

“`javascript

const form = {

username: ”,

password: ”,

validate: function() {

const isUsernameValid = this.username.length > 0;

const isPasswordValid = this.password.length >= 6;

return isUsernameValid && isPasswordValid;

}

};

const validateBound = form.validate.bind(form);

console.log(validateBound()); // 输出:false

form.username = ‘bind’;

console.log(validateBound()); // 输出:false

form.password = ‘bind123’;

console.log(validateBound()); // 输出:true

“`

2. 使用bind函数实现跨域请求

以下是一个使用bind函数实现跨域请求的示例:

“`javascript

const http = {

get: function(url, callback) {

// 使用XMLHttpRequest发送跨域请求

const xhr = new XMLHttpRequest();

xhr.open(‘GET’, url);

xhr.onreadystatechange = function() {

if (xhr.readyState === 4) {

callback(xhr.responseText);

}

};

xhr.send();

}

};

const getBound = http.get.bind(http);

getBound(‘https://api.example.com/data’, function(data) {

console.log(data);

});

“`

五、总结

bind函数是JavaScript中一个非常实用的内置函数,它可以帮助我们改变函数的上下文环境、预设函数参数以及实现一些有趣的应用。在实际开发过程中,合理运用bind函数可以提升代码的可读性和可维护性。本文深入解析了bind函数的应用场景、使用技巧以及一些案例分析,希望能对大家有所帮助。

C++ bind函数

bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。对于未指

定的参数,可以使用占位符_1、_2、_3来表示。-1表示绑定后的函数的第1个参数,_2表示绑定后的函数的第2个参数,其他依次类推。

bind可以绑定到普通函数、函数对象、类的成员函数和类的成员变量。先介绍最简单的这种试试理解。

普通函数

1 void nine_arguments(int i1,int i2,int i3,int i4,int i5,int i6,int i7,int i8,int i9);

int i1=1, i2=2, i3=3, i4=4, i5=5, i6=6, i7=7, i8=8, i9=9;

2bind(nine_arguments,_9,_2,_1,_6,_3,_8,_4,_5,_7(i1,i2,i3,i4,i5,i6,i7,i8,i9);

3bind(nine_arguments,i9,i2,i1,i6,i3,i8,_1,_2,_1)(i8,i9);

4bind(nine_arguments, i9,i2,i1,i6,i3,i8,i4,i5,i7)();

上述5个例子中:

1是普通函数形势

2是指,对1这个函数,我们更换其中参数的顺序,你看nine_arguments,_9,_2,_1,_6,_3,_8,_4,_5,_7,后面跟的第一个指定的占位符是9,所以意思是,对后面括号里的第一个参数i1,把他的值赋给原函数

void nine_arguments(int i1,int i2,int i3,int i4,int i5,int i6,int i7,int i8,int i9)

里的第9个参数,后面的依次对应。最终等价于调用函数nine_arguments(i3,i2,i5,i7,i8,i4,i9,i6,i1)

理解2的基础上,3等价于nine_arguments(i3,i2,i5,i7,i8,i4,i8,i9,i8)

应该是这样。。

JQuery入门——用bind方法绑定事件处理函数应用介绍

1、bind()功能是为每个选择元素的事件绑定处理函数,其语法如下:bind(type,

[data],

fn)

其中type为一个或多个类型的字符串,如click或change,也可以自定义;可以被type调用的类型包括blur、focus、load、resize、scroll、unload、click、dbclick、mousedown等事件。参数data是作为event.data属性值传递对象的额外数据对象。参数fn是绑定到每个选择元素的事件中的处理函数。

2、示例代码:

复制代码

代码如下:

<!DOCTYPE

html

PUBLIC

“-//W3C//DTD

XHTML

1.0

Transitional//EN”

“”>

<html

xmlns=””>

<head>

<meta

http-equiv=”Content-Type”

content=”text/html;

charset=utf-8″

/>

<title>bind方法绑定事件</title>

<script

type=”text/javascript”

src=”jquery-1.8.3.min.js”></script>

<script

type=”text/javascript”>

$(function(){

var

intI=0;

$(“#btnBind”).bind(“click

“,function(){

intI++;

$(“.clsShow”).show().html(“您好,欢迎来到JQuery世界!”).append(“<div>执行次数”+intI+”</div>”);

$(this).attr(“disabled”,”disabled”);//按钮不可用

})

})

</script>

</head>

<body>

<input

id=”btnBind”

type=”button”

value=”Button”

class=”btn”/>

<div

class=”clsShow”></div>

</body>

</html>

3、效果图预览:

再点击则无反应

C11新特性之std::function与std::bind

std::function其实就是一个类模板,含有c的函数指针概念。

类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。

简要来说:std::function是将所有可调用的实体封装起来,形成了一个新的std::function对象,用户在使用的时候不需要再去一一调用实体,只需要使用新的std::function来调用各实体

如下,std::function作为回调函数使用,它可以调用任何有两个int形参的返回值为int的对象

又因为std::function兼容c的函数指针,所以它还包含函数指针应有的特性。但是它又和函数指针不同,函数指针只能指向一个函数,而 std::function可以指向任何可以被当做函数调用的对象

以下内容来自

因为调用initWithFunction会产生临时的std::function对象,属于右值,必须使用const,不然会报错

转移操作std::move效率更高

std::bind完成了实体和函数地址的绑定,因为它的参数里面既有对象指针,又有函数指针,从而制造了一个std::function,然后std::function只要能正确处理那个this指针,那就能完成正确地调用了

bind是一种机制,可以预先把指定的可调用的实体的某些参数绑定到已有的变量,产生一个新的可调用实体。

它作为一个通用函数适配器,接收一个可调用对象,生成一个新的可调用对象来适应原对象的参数列表。

比如,存在一个这样的函数check_size,因为这是一个二元函数,当我们要将它作为find_if的参数,会出错。因为find_if只接受一元函数,那么如何解决呢?

一个方法是Lambda表达式,还有一个方法就是使用std::bind

下面这个bind的函数只有一个占位符,即只需要传入一个参数。它将check_size的第二个参数绑定在sz上,sz的值就是check_size的第二个参数的值,而check_size第一个参数需要传入

如果现在我们调用g(3,5),那么就相当于bind(f,a,b,5,c,3);

所以_1相当于传递的第一个参数,_2相当于传递的第二个参数…以此类推。

需要注意: bind对于直接绑定的值,是以值传递的方式,对于用_1这类,是使用引用传递。bind的返回值是可以调用的实体,所以通常我们都会将它和function联合在一起使用。

有时候对于有些绑定的参数我们希望以引用方式传递,或者说要绑定的参数无法拷贝。

比如ostream流对象是无法拷贝的,那么我们希望将它传递给bind而不拷贝它,就需要使用 ref。

ref返回一个对象,包含给定的引用,是可以拷贝的。

对于成员函数的绑定,我们一定需要一个调用者,也就是类的实例!

需要注意的是,bind无法绑定重载函数,因为当重载函数的参数个数不相同时,bind也失去了它的意义。

在cocos2dx的源码中,我们经常可以看到function作为函数形参,而bind作为实参传入

关于bind函数的内容到此结束,希望对大家有所帮助。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享