JS明确指定函数的接受者

由于方法和值为对象的属性值没什么区别,因此很容易提取对象的方法作为回调函数直接传递给高阶函数。但这也很容易忘记应明确指定方法的接受者。例如,一个字符串缓冲对象使用数组来存储字符串。

var buffer = {
entries: [],
add: function(args) {
this.entries.push(args);
},
concat: function() {
return this.entries.join(‘‘);
}
};

var arr = [‘alert‘, ‘-‘, ‘123‘];
// error: entries is undefined
arr.forEach(buffer.add);
buffer.concat();


方法的接受者取决于它是如何被调用的。forEach方法的实现使用全局对象作为默认的接受者。由于全局对象没有entries属性,因此这段代码抛出了一个错误。

在回调函数中执行方法

var arr = [‘alert‘, ‘-‘, ‘123‘];
arr.forEach(function() {
buffer.add(arr);
});
buffer.concat();

该方法创建一个显示地以buffer对象方法的方式调用add()。

使用bind()返回一个指定接受者的函数

创建一个函数用来实现绑定其接受者到一个指定对象是常见的。

arr = [‘alert‘, ‘-‘, ‘123‘];
arr.forEach(buffer.add.bind(buffer));
buffer.concat();

注意,bind()返回的是一个新的函数而不是修改buffer.add函数。这意味着bind方法是安全的。

其实forEach()允许调用者提供一个可选的参数作为回调函数的接受者。arr.forEach(buffer.add, buffer)。

兼容没有实现forEach()方法的浏览器

if(typeof Function.prototype.forEach !== ‘function‘) {
Function.prototype.bind = function(context) {
return this.apply(context, [].slice.call(arguments, 1));
}
}

JS明确指定函数的接受者,布布扣,bubuko.com

时间: 2024-10-26 16:07:52

JS明确指定函数的接受者的相关文章

js判断指定函数、变量是否存在的方法

//判断是否存在指定函数 function isExitsFunction(funcName) { try { if (typeof (eval(funcName)) == "function") { return true; } } catch (e) { } return false; } // 判断是否存在指定变量 function isExitsVariable(variableName) { try { if (typeof (variableName) == "u

JS中的函数、Bom、DOM及JS事件

本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的声明及调用] 1.函数声明的格式: function 函数名(参数1,参数2,参数3,--){//函数体 return 结果; } >>>函数的调用格式: 直接调用:函数调用的格式:函数名(参数一的值,参数二的值,--): 事件调用:事件名=函数名( ); 2.函数声明的几点强调: ①函数名

js使用split函数按照多个字符对字符串进行分割的方法

这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js使用split函数按照多个字符对字符串进行分割的方法.分享给大家供大家参考.具体分析如下: js中的split()函数可以对字符串按照指定的符号进行分割,但是如果字符串中存在多个分割符号,js的split()函数是否还可以胜任呢,答案是肯定的,js的split()函数可以通过正则表达式实现多分隔符的字符串分割,调用也很简单,下面

常用JS验证和函数

下面是我常用一些JS验证和函数,有一些验证我直接写到了对象的属性里面了,可以直接通过对象.方法来调用 //浮点数除法运算 function fdiv(a, b, n) { if (n == undefined) { n = 2; } var t1 = 0, t2 = 0, r1, r2; try { t1 = a.toString().split(".")[1].length } catch (e) { } try { t2 = b.toString().split(".&q

js中的函数,Date对象,Math对象和数组对象

函数就是完成某个功能的一组语句,js中的函数由关键字 function + 函数名 + 一组参数定义;函数在定义后可以被重复调用,通常将常用的功能写成一个函数,利用函数可以使代码的组织结构更多清晰. 其语法结构为 function funName (arg0, arg1, … argN){        //statements    } function say_hello (name, msg){ alert(“hello”+ name + “:”+ msg); } say_hello(“d

js之匿名函数

js之匿名函数   这篇博文内容来自于javascript高级程序设计第2版,向作者致敬 函数声明: function functionName(arg0,arg1){ //函数体 } 函数表达式: var functionName = function(arg0,arg1){ //函数体 } 函数声明和函数表达式之间的主要区别是前者会在代码执行前被加载到作用域中,而后者是在代码执行到那一行的时候才会有定义.另一个区别是函数声明会给函数指定一个名字,而函数表达式则创建一个匿名函数,然后将这个函数

JS之——回调函数的简单应用(插曲)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46274893 JS无疑是前端页面与服务端交互数据的强大语言,那么如何利用JS的回调函数来封装JS的网络请求呢,本文就来简单说明这一问题 一.创建一个index.html文件 页面内容随便定义,重点是要引入如下自定义的两个js文件,一个是constants.js一个是validate.js 二.创建constants.js文件 /** * Created by liuyazhuan

JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype

一)函数 A)JS中的函数的定义格式: function add(a,b) { var sum = a+b; document.write("两个数的和是:" + sum); //return sum; } 上面只是一个例子 ,那么当我们再定义一个同名的函数会怎么样呢? function add(a,b,c) { var sum = a+b+c; document.write("三个数的和是:" + sum); } 然后调用函数: add(50,30,10);   

JS中encodeURIComponent函数用php解码的代码

JS中encodeURIComponent函数给中文编码后,如何用php解码?? 前提:编码前的中文可能是gbk,gb2312,utf-8等. 复制代码 代码如下: urldecode() iconv() 在JS中使用了encodeURIComponent对中文进行编码在PHP中使用iconv('UTF-8','gb2312',$q);就可以得到你需要的字串了,其中gb2312根据你实际应用来定如还不明白为什么看下面的文章 URL编码转换,escape() encodeURI() encodeU