理解prototype.js的bind函数
来源:互联网 发布:网络监管员是做什么的 编辑:程序博客网 时间:2024/04/30 11:15
http://muyu.iteye.com/blog/423917
先看call(或apply)的用处:
- var first_object = {
- num: 42
- };
- function multiply(mult) {
- return this.num * mult;
- }
- multiply.apply(first_object, [5]); //等于 42*5
在上面的例子中,multiply是一个function,里面有this,所以,它必须“成为某个对象的方法才能执行”。这里的multiply函数中的this默认为全局的window对象:
- function multiply(mult) {
- return this.num * mult;
- }
- window.num = 100;
- multiply(4); //等于 400
由于JavaScript是动态语言,一个对象的方法可以被变成另外的对象的方法,所以,该方法下的this会发生变化。
- function multiply(mult) {
- return this.num * mult;
- }
- var book = {
- num : 33
- };
- book.total = multiply;
- book.total(10);
换种写法,采用new关键字
- function multiply(mult) {
- return this.num * mult;
- }
- function Book(newNum) {
- this.num = newNum;
- }
- var book = new Book(33);
- book.total = multiply;
- book.total(10);
再看看下面的写法,和平时写的类比较像了:
- function Book(newNum) {
- this.num = newNum;
- this.total = function (mult) {
- return this.num * mult;
- }
- }
- var book = new Book(33);
- book.total(10);
正因为this指针的不确定性,使得this所属函数定义的 和 实际执行的 上下文环境不同,从而计算出非预期的结果。
再看最初的代码示例,我们用js提供的call函数来解决this的问题。可以考虑给function函数原型增加一个bind方法------它只是封装了apply函数,返回值是一个function:
- var first_object = {
- num: 42
- };
- function multiply(mult) {
- return this.num * mult;
- }
- Function.prototype.bind = function(obj) { //该行可换做 multiply.prototype.bind = function(obj) {
- var method = this;
- return function() {
- return method.apply(obj, arguments);
- };
- }
- var foo = multiply.bind(first_object);
- foo(5);
(把bind方法建立在multiply的原型上也可,如注释所示)
总之,把正确的方法放在正确的对象里,才是bind方法的目的。请参看prototype.js关于bind方法的API:
http://www.prototypejs.org/api/function/bind
下面是prototype.js关于bind的源代码:
- bind: function() {
- if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
- var __method = this, args = $A(arguments), object = args.shift();
- return function() {
- return __method.apply(object, args.concat($A(arguments)));
- }
- },
参考网址:
http://www.digital-web.com/articles/scope_in_javascript/
0 0
- 理解prototype.js的bind函数
- 理解prototype.js的bind函数
- 对js里bind函数的理解
- 理解javascript的 Function.prototype.bind
- js prototype的理解
- 理解Function.prototype.bind
- js的原型prototype理解
- js中prototype的理解
- 理解javascript的函数prototype
- js关于Function.prototype.bind
- prototype的bind用法
- 关于prototype.js的一些技术说明 bind bindAsEventLinstener
- js中Function.prototype的bind()方法-学习笔记
- 深入理解js的prototype以及prototype的一些应用
- JS的prototype和_proto_的理解
- js中的prototype对象的理解
- 对js中new、prototype的理解
- 关于js中prototype的理解
- 引用 CSS行高line-height属性理解及应用
- 数据库备份遇到的问题
- 在线升级,下载升级包过程中提示网络异常导致升级失败。
- IOS之KVC
- [LeetCode] Longest Common Prefix
- 理解prototype.js的bind函数
- Windows命令行下面编译一个Java文件需要引用另一个class文件解决办法
- DDoS攻击防御
- 我一定要赚好多好的钱,孝敬父母
- 什么是项目管理
- 兮°不要忽略Android中@id与@+id区别噢
- java的list用法
- arcgis图层叠加不匹配
- 什么是COM组件