这是一个函数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";
我发现它具有挑战性,因为在我有过滤字符串之前,我既不知道属性也不知道它们的组合。
答案 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