是否可以绑定一个javascript函数,使其本地上下文与'这个相同?

时间:2016-03-12 01:17:39

标签: javascript function functional-programming

这是一个函数nameExists,可以绑定到一个对象并返回其name属性是否为空。

var nameExists = function(){
  return this.name.length > 0;
}
var person = {name: "John"};
var johnHasName = nameExists.bind(person);
johnHasName();

现在,我希望能够以某种方式简化此nameExists功能,以便我不再需要使用this关键字,这将是这样的:

var nameExists = function(){
  return name.length > 0;
}

这假设函数的本地上下文等于其this上下文。基本上我正在寻找一种以任何可能的方式调用/绑定/应用此功能的方法,这样我就不必使用this关键字。

我有充分的理由尝试这样做,所以请不要判断。我甚至不确定这是否可行,并且已经考虑了一些但是无法想出一个想法。我很感激帮助!

P.S。 我尝试这样做的原因是因为我试图从字符串动态构造过滤函数。因此,例如,如果我想创建一个过滤函数,确定一个人是否有一个名字,年龄超过20岁,我会写这样的东西:

var john = {name: "john", age: 3};
var filter = "this.name.length > 0 && this.age > 20";
var fun = new Function("return " + filter);
var filterForJohn = fun.bind(john);
filterForJohn();

这样做很好,但我不喜欢冗长,所以想简化过滤字符串以便我可以写

var filter = "name.length > 0 && age > 20";

我发现它具有挑战性,因为在我有过滤字符串之前,我既不知道属性也不知道它们的组合。

1 个答案:

答案 0 :(得分:1)

您可以使用with语句扩展范围链:

var nameExists = function() {
  with(this) {
    // Here you don't need `this`:
    return name.length > 0;
  }
}

但是,它很慢并且在非严格模式下不建议使用它,并且在严格模式下禁止使用。

在Web浏览器上,一个疯狂的选择是使用事件处理程序内容属性。您无法直接访问事件处理程序返回的值,但如果它是false,则该事件将被取消。

var makeObj, callFunc;
(function() {
  var parent = document.createElement('div'),
      eventCanceled;
  parent.addEventListener('click', function(e) {
    eventCanceled = e.defaultPrevented;
  });
  makeObj = function(props, funcStr) {
    var obj = document.createElement('div');
    Object.assign(obj, props);
    obj.setAttribute("onclick", "return " + funcStr);
    parent.appendChild(obj);
    return obj;
  };
  callFunc = function(obj) {
    obj.click();
    return !eventCanceled;
  };
})();
var obj = makeObj({name: "john", age: 3}, "name.length > 0 && age > 20");
callFunc(obj); // false