在javascript中执行以下操作的最惯用方法是什么:
如果调用者没有将myParam传递给MyFunc,那么我想将其设置为默认值.但首先我想尝试从另一个可能尚不存在的对象中获取它:
function MyFunc(myParam) {
if (!myParam) {
if (!myObj) {
myParam = 10;
}
else {
myParam = myObj.myParam;
}
}
alert(myParam);
}
Run Code Online (Sandbox Code Playgroud)
我开始写:
myParam = myParam || myObj.mParam || 10
Run Code Online (Sandbox Code Playgroud)
但意识到如果myObj不存在那么这将失败.我猜可以猜到:
myParam = myParam || (myObj && myObj.mParam) || 10
Run Code Online (Sandbox Code Playgroud)
它甚至可能有效.但这是最好的方式吗?
例如John Resig会怎么做?
经过多年的网络开发,我突然回到了WinForms,并且遇到了一些应该很简单的问题.我有一个ArrayList绑定到Windows窗体的业务对象DataGrid.我希望用户能够编辑单元格,完成后,按"保存"按钮.此时,我想迭代所有的行和列 DataGrid以查找任何更改,并将它们保存到数据库中.但我找不到访问DataGrid行的方法.
我还想在编辑时实时验证单个单元格,但我很确定可以完成.(也许没有ArrayList像DataSource?)但至于迭代DataGrid,我很惊讶它似乎不可能.
我是否必须将业务对象数据填充到数据表中才能使用数据网格?
当setTimeout调用它的匿名回调时,为什么'me'和'this'未定义?
var gMyObj = new MyObj();
gMyObj.myFunc();
function MyObj() {
this.myFunc = function () {
var me = this;
alert(me.constructor); // defined
setTimeout(function(me) {
alert(me.constructor); // undefined
}, 100);
};
}
Run Code Online (Sandbox Code Playgroud)
解决方案:所选答案是正确的,谢谢.我的问题是简化了我遇到的真正问题,结果证明jQuery在click()方法中修改了'this',以便它指向相关的DOM元素.我创建了一个新的var,'me',以保持'this',并试图将其传递给click方法.我需要做的只是在click事件中使用'me',并让闭包保持对它的引用.将'me'传递给click()失败,原因与此示例中失败的原因相同,即click()没有预料到它.
我正在创建一个对象文字,我将其用作命名空间.对象文字(命名空间)碰巧包含构造函数MyConstructor.我想在对象文字中扩展MyConstructor的原型.如果我将MyConstructor的声明拉出来并将其放在myNamespace的声明之上,那么一切都很好,除了myConstructor不再被myNamespace命名.如何最好地使这项工作?由于
'' ,以下无法编译.在这一行:
MyConstructor.prototype = {
Run Code Online (Sandbox Code Playgroud)
下面提供了对象文字.
谢谢,迈克
var myNamespace = {
a: 3,
b: function (msg) {
alert(this.a);
},
MyConstructor: function(xx) {
this.x = xx;
},
MyConstructor.prototype = {
a: 1,
b: function() {
return true;
}
}
};
Run Code Online (Sandbox Code Playgroud)
更新:已接受的解决方案有效.但是,我的问题的前提是有缺陷的.在这种情况下,我根本不会使用对象文字,因为我发现单元测试更难.相反,我会使用由构造函数创建的普通对象,并将私有对象放在其中.另一件事是,"自我/立即执行的功能",虽然在某些方面很漂亮,但对新手来说有点难以解释.