如何将'this'与函数一起传递?

时间:2011-03-30 14:08:03

标签: javascript

我想将一些函数调用从一个对象委托给另一个对象:

objA.feature = objA.component.feature;

(假设feature应该是objA及其组件中的函数)

但这显然不起作用,因为this的引用从函数中被剥离,并且在被调用时最终成为一个完全不同的对象(它实际上是objA而不是{{ 1}})。

你需要写这样的东西才能让它发挥作用:

objB.component

是否有更短(惯用)的方法呢?

3 个答案:

答案 0 :(得分:5)

在较新的运行时中,函数原型上有一个名为"bind"的函数:

var newFunc = someFunc.bind(somethingThatShouldBeThis);
当调用“newFunc”时,

会使this引用“somethingThatShouldBeThis”。

您可以从Functional库中窃取代码,以便在缺少本地代码的环境中提供“绑定”功能。

编辑 - 这是功能代码:

Function.prototype.bind = function(object/*, args...*/) {
    var fn = this;
    var args = Array.slice(arguments, 1);
    return function() {
        return fn.apply(object, args.concat(Array.slice(arguments, 0)));
    }
}

很简单,嗯?它只返回一个函数,在调用时,它将第一个参数作为函数调用,并传递你传入的任何参数到结果(也就是上面例子中的“newFunc”)。主要的皱纹是,这个还可以节省原来传递的额外参数,这有时可以很方便。

答案 1 :(得分:1)

以下是关于范围的精彩文章:

Binding Scope in JavaScript

但是,大多数JavaScript框架(MooTools,jQuery)都内置了这种方法。 jQuery使用“代理”而MooTools使用“绑定”,所以一定要查看你正在使用的任何框架的文档。

答案 2 :(得分:0)

最好的办法是使用像某些框架一样的createDelegate风格的方法。几年前OdeToCode发布了一个简单的实现。