无法使用回调函数作为对象方法

时间:2014-08-12 08:34:36

标签: javascript

对象方法通常像这样声明和使用

points = { 
  first : function(){
    return this.val[0];
  }
};
points.val = [1,2];
points.first(); // returns 1

但为什么我不允许使用回调而不是声明的方法。

points.val = [1,2];
points.(function(){
    return this.val[0];
  })();

3 个答案:

答案 0 :(得分:1)

在对象上调用方法包含两个步骤:

  1. 按键查找对象属性
  2. 执行返回的属性(必须是函数,或者引发TypeError)。
  3. 在第一个示例中,您的调用代码使用.语法检索points的属性,其中包含键first。然后它执行返回的属性,这是一个匿名函数。

    在第二个示例中,您尝试使用键查找对象:

    (function(){
      return this.val[0];
    })
    

    在JavaScript中,Object keys must be valid identifiersFunction expressions不是有效的标识符,因此编译器会引发SyntaxError

    如果您尝试使用动态定义的使用this来引用points的函数,则使用bind

    (function() { return this.val[0] }).bind(points)()
    

答案 1 :(得分:1)

您可以通过在接受回调的点上定义函数

var points = {val:[1,2]};
points.func = function(callback){
    callback.call(this);
}

并用

调用它
points.func(function(){
    return this.val;
})

您不能使用函数作为对象键,但可以向对象添加函数。您还可以在对象外定义函数,并使用.call.apply方法

function val(){
    return this.val;
}

val.call(points);

答案 2 :(得分:0)

我认为你要做的就是为积分做一个吸气剂/设定者。

points={};

// pass in an array to set points or pass a callback to retrieve them!
points.val = function (points){
//test if points is a callback return points to callback
if (typeof points==="function") return points(this._points); 
// or set the points with the passed in value
this._points=points;
};

//set the points
points.val([1,2])

//get points into callback

points.val(function(e){
    return e[0];
});