首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有相当于Ruby的andand的Javascript?

有没有相当于Ruby的andand的Javascript?
EN

Stack Overflow用户
提问于 2009-01-07 22:07:09
回答 7查看 1.5K关注 0票数 5

为了让我的Javascript变得不那么引人注目,我使用了onLoads来给Javascript s等等添加功能。在Dojo中,这看起来类似于:

代码语言:javascript
复制
var coolInput = dojo.byId('cool_input');
if(coolInput) {
  dojo.addOnLoad(function() {
    coolInput.onkeyup = function() { ... };
  });
}

或者,大致等同地:

代码语言:javascript
复制
dojo.addOnLoad(function() {
  dojo.forEach(dojo.query('#cool_input'), function(elt) {
    elt.onkeyup = function() { ... };
  });
});

有没有人写了一个Ruby的andand实现,这样我就可以做下面的事情了?

代码语言:javascript
复制
dojo.addOnLoad(function() {
  // the input's onkeyup is set iff the input exists
  dojo.byId('cool_input').andand().onkeyup = function() { ... };
});

代码语言:javascript
复制
dojo.byId('cool_input').andand(function(elt) {
  // this function gets called with elt = the input iff it exists
  dojo.addOnLoad(function() {
    elt.onkeyup = function() { ... };
  });
});
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-04-14 21:04:18

您想要的确切语法在JavaScript中是不可能的。JavaScript的执行方式需要以一种非常基本的方式进行更改。例如:

代码语言:javascript
复制
var name = getUserById(id).andand().name;
//                        ^
//                        |-------------------------------
// if getUserById returns null, execution MUST stop here |
// otherwise, you'll get a "null is not an object" exception

然而,JavaScript不是这样工作的。它根本就不是。

下面这行代码执行的几乎就是您想要的。

代码语言:javascript
复制
var name = (var user = getUserById(id)) ? user.name : null;

但是可读性不能扩展到更大的例子。例如:

代码语言:javascript
复制
// this is what you want to see
var initial = getUserById(id).andand().name.andand()[0];
// this is the best that JavaScript can do
var initial = (var name = (var user = getUserById(id)) ? user.name : null) ? name[0] : null;

而且这些不必要的变量也有副作用。我使用这些变量来避免重复查找。变量搞乱了上下文,如果这是个大问题,你可以使用匿名函数:

代码语言:javascript
复制
var name = (function() {return (var user = getUserById(id)) ? user.name : null;})();

现在,user变量被正确地清除了,每个人都很高兴。但是哇!打字太多了!:)

票数 2
EN

Stack Overflow用户

发布于 2009-01-07 23:12:06

我不知道Dojo,但是您的第一个示例不应该是这样的吗

代码语言:javascript
复制
dojo.addOnLoad(function() {
    var coolInput = dojo.byId('cool_input');
    if(coolInput)
        coolInput.onkeyup = function() { ... };
});

否则,您最终可能会在构建DOM之前尝试访问该元素。

回到您的问题:在JavaScript中,我将andand()实现为

代码语言:javascript
复制
function andand(obj, func, args) {
    return obj && func.apply(obj, args || []);
}

然后,您的示例可以编写为

代码语言:javascript
复制
dojo.addOnLoad(function() {
    andand(dojo.byId('cool_input'), function() {
        this.onkeyup = function() { ... };
    });
});

这并不比使用显式的if语句短多少-所以为什么要麻烦呢?

票数 3
EN

Stack Overflow用户

发布于 2009-04-14 21:25:55

你想要dojo.behavior

代码语言:javascript
复制
dojo.behavior.add({
    '#cool_input': {
        onKeyUp: function(evt) { ... }
    }
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/422355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档