我正在为数据库API编写一个小包装器来添加自定义功能。
我只想拍摄view
函数而不是修改,所以我尝试分配函数:
core.db.view = bucket.view;
该功能似乎有效,但存在HTTP错误。如果我包装函数,一切正常,但我更喜欢只分配函数。
core.db.view = function (a, b, c) {
return bucket.view(a, b, c);
};
有什么想法吗?
答案 0 :(得分:7)
下面两个调用之间的唯一区别是它们执行的上下文:
core.db.view = bucket.view;
bucket.view() // 'this' will be bucket
core.db.view() // 'this' will be core.db
解决方案:
core.db.view = bucket.view.bind(bucket);
PS:bind方法与你自己包装函数的方式类似。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
答案 1 :(得分:2)
在Javascript中
obj.method();
和
var m = obj.method; m();
是不同的事情。更具体地说,在两种情况下,执行方法体的this
值是不同的:在第一种情况下this
将是obj
,在第二种情况下this
var m = function(){return obj.method()};
1}}将成为全局对象。
解决方案是将方法调用包装在闭包中:
{{1}}